2

我有一个名为 Price 的表,由几个字段组成,其中两个是ProductIdPriceType。有些产品同时具有 Wholesale price(PriceType = W)和 Retail price (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 子句。

有任何想法吗?

4

2 回答 2

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 列的价格表

于 2012-06-13T08:18:53.173 回答
1

我认为您正在寻找Left Excluding JOIN,检查SQL 连接的可视化表示

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'

我还没测。。

希望这有助于实施..

于 2012-06-13T08:25:01.020 回答