2012-06-13 135 views
2

我有一个表,称为价格组成的几个字段,其中两个是产品编号价格类型。一些产品同时具有批发价格(PriceType = W)和零售价格(PriceType = R),即它们具有两个具有相同产品ID的记录。从一个表中获取记录不在另一个表中

我想向用户展示那些没有零售价的产品(即那些只有一个记录W的产品)。

我应该如何编写我的查询来做到这一点?

我已经使用类似

Select * from Products 
INNER JOIN Prices ON Products.Id = Prices.ProductId 
WHERE ProductId NOT IN 
    (SELECT ProductId FROM Prices WHERE PriceType="R") 

但这是执行速度很慢。我已经检查并验证了花费很长时间的部分实际上是NOT IN子句。

任何想法?

+1

是否运行在MS Access或SQL Server查询,也就是,它是一个传递查询还是针对链接表的查询? – Fionnuala

回答

2
SELECT * 
FROM Products 
INNER JOIN Prices 
     ON Products.Id = Prices.ProductId 
     AND Prices.PriceType = 'W' 

这将筛选出价格的加入,所以你永远不会有任何PriceType='R'记录加入。

,以筛选出完全不具有“R”的记录,你可以使用下面的查询,这消除了对你的where子句中的子选择

SELECT 
    Products.ProductId 
FROM 
    Products 
    INNER JOIN Prices A 
     ON Products.ProductId = A.ProductId 
     AND A.PriceType = 'W' 
    LEFT JOIN Prices B 
     ON A.ProductId = B.ProductId 
     AND B.PriceType <> A.PriceType  
WHERE 
    A.PriceType = 'W' 
    AND B.PriceId is null 

为了确保该运行速度有可能,确保您添加索引到你的价格表包括产品ID和PriceType列

+0

感谢您的支持,但我相信这会以批发价格返回所有产品;这就是所有的产品;我真的在寻找批发价格的产品,这些产品也没有零售价格。 – user1012598

+0

酷,我编辑我的答案还包括一个查询 –

1

我认为你正在寻找Left Excluding JOIN,检查Visual Representation of SQL Joins

SELECT <select_list> 
FROM Table_A A 
LEFT JOIN Table_B B 
ON A.Key = B.Key 
WHERE B.Key IS NULL 

所以您的查询应该是:

Select * from Products 
Left JOIN Prices ON Products.Id = Prices.ProductId 
Prices.ProductId IS NULL 
AND 
Prices.PriceType = 'W' 

我没有测试过..

希望这有助于实现..

相关问题