如果之前已经提出过要求,请提前道歉,但我见过的大多数类似例子只涉及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的那一行。
就像我说的那样,我已经尝试了多种连接方式或现有方式,但是第三方方面让我失望。
非常感谢任何帮助。
答案 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中拥有的东西。您可以更新这个并提供所需输出的详细信息。
答案 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的建议。非常感谢。