【问题标题】:SQL: Return value based on relationship of relationshipSQL:根据关系的关系返回值
【发布时间】:2020-03-08 21:52:31
【问题描述】:

考虑 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   |
+------+-----+-------+--------+

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

【问题讨论】:

  • 请在代码问题中给出minimal reproducible example--剪切&粘贴&可运行代码;具有期望和实际输出(包括逐字错误消息)的示例输入(作为初始化代码);标签和版本;明确的规范和解释。对于包含最少代码的错误,您可以给出的代码是您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)对于包含 DBMS 和 DDL 的 SQL,其中包括约束、索引和表格初始化。 How to Ask

标签: sql tsql join azure-sql-database


【解决方案1】:

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

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

如果可能存在未知的垃圾箱或供应商,您可以使用left joins 而不是inner joins。

【讨论】:

  • 在尝试了您建议的查询并获得相同的结果(null)后,我意识到问题实际上是我的测试表中的错误数据。 NULL 是准确的;我的 STOCK 表和 BINS 表中的 bin 名称之间有错字。我在我的问题中发布的查询和您的查询都在我更正我正在处理的示例数据后立即起作用。虽然我会按照你的建议使用JOINS,而不是嵌套选择。
  • 欢迎@Crayons。如果我的回答正确回答了您的问题,请点击复选标志accept it。您也可以使用上箭头对其进行投票。
猜你喜欢
  • 1970-01-01
  • 2020-07-31
  • 1970-01-01
  • 1970-01-01
  • 2018-08-17
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多