2

いくつかのフィールドで構成される Price というテーブルがあり、そのうちの 2 つはProductIdPriceTypeです。一部の製品には、卸売価格(PriceType = W)と小売価格(PriceType = R)の両方があります。つまり、同じ製品 ID を持つ 2 つのレコードがあります。

小売価格のない製品 (つまり、レコード W が 1 つしかない製品) をユーザーに表示したいと考えています。

これを行うには、クエリをどのように記述すればよいですか?

私は次のようなものを使用しました

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 列の両方を含む Price テーブルにインデックスを追加してください。

于 2012-06-13T08:18:53.173 に答える
1

私はあなたが探していると思います、SQL結合の視覚的表現をLeft Excluding JOINチェックしてください

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 に答える