从一个表中获取记录而不是在另一个表中

时间:2012-06-13 08:07:12

标签: sql-server ms-access

我有一个名为Price的表,由几个字段组成,其中两个是 ProductId PriceType 。某些产品同时具有批发价(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子句。

有什么想法吗?

2 个答案:

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

为确保尽可能快地运行,请确保向包含ProductId和PriceType列的Price表添加索引

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

我还没有测试过..

希望这有助于实施..