SQL Server:根据来自其他2个表

时间:2017-08-29 19:39:59

标签: sql-server left-join

如果之前已经提出过要求,请提前道歉,但我见过的大多数类似例子只涉及2张桌子而且我很难适应我的情况。

我有一个查询,要从表 ProductList 中选择产品编号计量单位,而不是在另一个表中, PriceFile

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

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

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,我会得到产品编号我正在寻找,但我得到了两个度量单位产品表中。

proCode untCode
13717   DZ
13717   HC

我只想要HC作为UM的那一行。

就像我说的那样,我已经尝试了多种连接方式或现有方式,但是第三方方面让我失望。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我不确定你到底在找什么,但你在最后的选择输出中有untCode列,它将返回该列的所有不同结果,这就是你获得2行的原因。

我构建了我认为你在SQL Fiddle中拥有的东西。您可以更新这个并提供所需输出的详细信息。

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

答案 2 :(得分:1)

使用@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的建议。非常感谢。