SQL Server:根据来自其他 2 个表的子查询从表中选择

Posted

技术标签:

【中文标题】SQL Server:根据来自其他 2 个表的子查询从表中选择【英文标题】:SQL Server: Select from table based on subquery from 2 other tables 【发布时间】:2017-08-29 19:39:58 【问题描述】:

如果之前有人问过这个问题,请提前道歉,但我看到的大多数类似示例只涉及 2 张桌子,我很难适应我的情况。

我有一个查询要从表 ProductList 中选择 Product NumberUnit Of Measure 不在另一个表中,价格文件

SELECT DISTINCT Prod_Num, [PriceFile].UM FROM [dbo].[PriceFile]
LEFT JOIN [dbo].[ProductList]
ON [PriceFile].Prod_Num = [ProductList].Product
WHERE [ProductList].Product IS NULL

使用表中当前的数据,这为我提供了以下信息:

Prod_Num    UM
13717       HC

我现在需要使用此查询的结果来查询第三个表 Products,我尝试这样做:

SELECT DISTINCT ProductID AS proCode,Prod_Desc AS proName,
UPC_Code AS proBarCode,UM_SOLDBY AS untCode
FROM [dbo].[Products]
WHERE ProductID IN 
(
SELECT DISTINCT Prod_Num, [PriceFile].UM FROM [dbo].[PriceFile]
LEFT JOIN [dbo].[ProductList]
ON [PriceFile].Prod_Num = [ProductList].Product
WHERE [ProductList].Product IS NULL
)

但这当然给了我错误:

选择列表中只能指定一个表达式,当 EXISTS 没有引入子查询。

我不知道从这里去哪里。如果我更改子查询使其只有 Prod_Num,我会得到我正在寻找的 Product Number,但我会得到两个存在的 Units Of Measure产品表中。

proCode untCode
13717   DZ
13717   HC

我只想要以 HC 作为 UM 的行。

就像我说的,我尝试了多种 JOIN-ing 或 WHERE EXIST-ing 方法,但第三个表方面让我失望。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

您可以通过合并两个结果然后过滤所需的行来消除这些重复。

SELECT DISTINCT A.ProductID AS proCode,
       A.Prod_Desc AS proName,
       A.UPC_Code AS proBarCode,
       A.UM_SOLDBY AS untCode
FROM [dbo].[Products] as A
INNER JOIN 
(
SELECT DISTINCT Prod_Num, [PriceFile].UM FROM [dbo].[PriceFile]
LEFT JOIN [dbo].[ProductList]
ON [PriceFile].Prod_Num = [ProductList].Product
) as B
ON B.Prod_Num = A.ProductID
WHERE B.Product IS NULL

【讨论】:

这似乎应该可以工作,但它没有返回任何值。列是空的。我会尝试使用它,看看我是否可以调整它。谢谢。【参考方案2】:

我不确定您要查找的确切内容,但您的最终选择输出中有 untCode 列,它将返回该列的所有不同结果,这就是您获得 2 行的原因。

我在 SQL Fiddle 中构建了我认为您拥有的东西。您能否更新此内容并提供所需输出的详细信息。

http://sqlfiddle.com/#!6/75687/1

【讨论】:

我实际上是在尝试从 Products 表中提取 PriceFile 中但不在 ProductList 中的任何产品和 UM 的附加信息。 Fiddle 似乎完全符合我现有的查询正在做的事情。顶部查询仅返回 PriceFile 中的单个 Prod+UM 组合,而不是 ProductList 中的组合。第二个查询返回来自第一个查询的 Prod 的两个 Prod+UM 组合,但它没有过滤掉第一个查询中未列出的 UM。这更有意义吗?【参考方案3】:

使用@LONG 提供的逻辑,我已经弄清楚了。我用从this question 中提取的逻辑更改了用作子查询的初始查询,然后稍微调整了LONG 的建议。完整的解决方案如下所示:

SELECT DISTINCT A.[ProductID] AS proCode,
   A.[Prod_Desc] AS proName,
   A.[UPC_Code] AS proBarCode,
   A.[UM_SOLDBY] AS untCode
FROM [dbo].[Products] AS A
INNER JOIN 
(
SELECT DISTINCT Prod_Num, PF.UM FROM [xSales].[dbo].[TCH_PriceFile] PF
WHERE NOT EXISTS (
SELECT Product, UM FROM [TCH_ProductList] PL
WHERE
PF.Prod_Num = PL.Product AND PF.UM = PL.UM)
) AS B
ON B.Prod_Num = A.[ProductID] AND B.UM = A.[UM_SOLDBY]

感谢@LONG 和@Kevin 的建议。非常感谢。

【讨论】:

恭喜! :):):):)

以上是关于SQL Server:根据来自其他 2 个表的子查询从表中选择的主要内容,如果未能解决你的问题,请参考以下文章

来自几个表的SQL语句

用于 4 个表的 SQL Server 2008 连接类型

SQL 服务器。从2个表中选择数据[重复]

视图中四个表的 SQL Server 条件连接

根据角色类型来自 3 个表的分层数据

sql2005 中的把2个表创建成一个视图