sql - SQL:根据关系的关系返回值
问题描述
考虑 SQL Server 数据库中的三个表STOCK
,BINS
和VENDORS
:
:: STOCK :: BINS :: VENDORS
+------+-----+-------+ +-----+--------+ +----+---------+
| SKU | BIN | COUNT | | BIN | VENDOR | | ID | NAME |
+------+-----+-------+ +-----+--------+ +----+---------+
| 1000 | A01 | 3 | | A01 | 1 | | 1 | Apples |
| 2000 | A02 | 4 | | A02 | 1 | | 2 | Oranges |
| 1000 | B01 | 6 | | B01 | 2 | +----+---------+
+------+-----+-------+ +-----+--------+
如何返回包含STOCK表中的所有列以及VENDORS表中的供应商名称的结果集,条件是我正在寻找特定的 sku。供应商名称需要根据 BINS 和 VENDORS 表之间的 ID 关系来确定。
所需的输出:
+------+-----+-------+---------+
| SKU | BIN | COUNT | VENDOR |
+------+-----+-------+---------+
| 1000 | A01 | 3 | Apples |
| 1000 | B01 | 6 | Oranges |
+------+-----+-------+---------+
我尝试使用左外连接以及嵌套选择。例如使用这个查询:
SELECT [stock].*,
(
SELECT [vendors].[name]
FROM [vendors], [bins]
WHERE [vendors].[id] = [bins].[vendor]
AND [bins].[bin] = [stock].[bin]
) AS [vendor]
FROM [stock]
WHERE [stock].[sku] = '1000'
我得到了这个结果(问题是 NULL):
+------+-----+-------+--------+
| SKU | BIN | COUNT | VENDOR |
+------+-----+-------+--------+
| 1000 | A01 | 3 | Apples |
| 1000 | B01 | 6 | NULL |
+------+-----+-------+--------+
我将如何形成我的查询,以便以最高效的方式实现上述所需的输出?
解决方案
简单的连接应该做你想做的事:
select
s.*,
v.name
from stock s
inner join bins b on b.bin = s.bin
inner join vendors v on v.id = b.vendor
where s.sku = 1000
如果可能存在未知的 bin 或供应商,您可以使用left join
s 代替inner join
s。
推荐阅读
- sql-server - 在 SQL Server 时态表删除上捕获 SysEndTime
- hibernate - 不删除时,已删除的对象将被级联重新保存
- optimization - 是否有可能/使用卫生宏进行编译时计算优化的例子有哪些?
- javascript - 我无法访问 JS 中的对象键
- python - 将 XML 属性检索到 DataFrame
- javascript - Angular 访问组件提供者的效果
- xslt - 如何使用 xslt 将一堆孤儿标签放在其他标签中
- css - Angular Material:无法更改 mat-table 中列的宽度
- c++ - 当存储新元素时,2D-Array 会自行删除元素
- drupal-8 - 数据库更新后实体和/或字段定义不匹配