2017-08-29 150 views
1

如果之前已经问过这个问题,但是大多数类似的例子我只看到过两个表格,我很难适应我的情况。SQL Server:根据来自其他两个表的子查询从表中选择

我有一个查询选择产品编号和表产品列表测量单位那是不是在另一个表,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 

我现在需要使用t他导致此查询的查询第三个表,产品,我尝试这样做:

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 
) 

但当然,这给我的错误:

Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.

而且我不知道该从哪里出发。如果我更改子查询以便它只有Prod_Num,我会得到产品号我正在寻找,但我同时获得了对于它存在于产品表中。

proCode untCode 
13717 DZ 
13717 HC 

而我只想要HC作为UM的线。

就像我说过的,我尝试过多种加入方式或在哪里存在,但是第三个表格方面却让我失望。

任何帮助将不胜感激。

回答

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

+1

恭喜! :) :) :) :) – LONG

1

您可以通过连接两个结果来消除这些dups,然后过滤所需的行。

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 
+0

这似乎应该工作,但它没有返回任何值。列是空的。我会尝试使用它,看看我是否可以调整它。谢谢。 – Adgy

1

我不知道你在寻找什么,但你有untCode列在您的最终选择输出它会为什么你的2行返回该列,这是所有不同的效果。

我建立了我认为你在SQL小提琴中的东西。你能否更新这个可能并提供你想要的输出的细节。

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

+0

我基本上试图从Products表中为PriceFile中的任何产品和UM提取其他信息,但不在ProductList中。 小提琴似乎正在做我已有的查询正在做什么。顶部查询只返回PriceFile中的单个Prod + UM组合,但不返回ProductList中。第二个查询从第一个查询返回Prod + UM组合的Prod + UM,但它不会过滤未在第一个列出的UM。 这是否更有意义? – Adgy

相关问题