我有一个名为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子句。
有什么想法吗?
答案 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'
我还没有测试过..
希望这有助于实施..