2012-06-13 167 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' 

我沒有測試過..

希望這有助於實現..

相關問題