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 Number 和 Unit 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 个表的子查询从表中选择的主要内容,如果未能解决你的问题,请参考以下文章