从一个表中获取记录不在另一个表中
我有一个表,称为价格组成的几个字段,其中两个是产品编号和价格类型。一些产品同时具有批发价格(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子句。
任何想法?
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列
感谢您的支持,但我相信这会以批发价格返回所有产品;这就是所有的产品;我真的在寻找批发价格的产品,这些产品也没有零售价格。 – user1012598
酷,我编辑我的答案还包括一个查询 –
我认为你正在寻找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'
我没有测试过..
希望这有助于实现..
是否运行在MS Access或SQL Server查询,也就是,它是一个传递查询还是针对链接表的查询? – Fionnuala