首页 > 解决方案 > SQL:根据关系的关系返回值

问题描述

考虑 SQL Server 数据库中的三个表STOCKBINSVENDORS

:: 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   |
+------+-----+-------+--------+

我将如何形成我的查询,以便以最高效的方式实现上述所需的输出?

标签: sqltsqljoinazure-sql-database

解决方案


简单的连接应该做你想做的事:

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 joins 代替inner joins。


推荐阅读