2011-11-15 8 views
2

2列に特定の値を持たない行を選択する必要があります。現在、私は次の操作を実行して、単一の列のためにこれをやっている:2列に特定の値を持たないレコードを選択してください。

SELECT * 
FROM MyTable 
WHERE (ManufacturerID = @ManufacturerID) 
    AND ItemID NOT IN(
     SELECT ItemID FROM UpdateMyTable WHERE [email protected] 
    ) 

しかし、今、私は同時に2列の値を含まない行をフィルタする必要があります:アイテムIDとChildItemIDを

方法私はこれを達成するだろうか?

+0

テーブルスキーマを投稿できますか?私は、あなたが求めていることを理解するのに一番簡単な時間を持っていません。 –

+0

NULLを使用して空の値をチェックする方法はありますか? – darnir

答えて

4
SELECT 
    * 
FROM 
    MyTable         AS data 
LEFT JOIN 
    (SELECT x, y, z FROM UpdateMyTable)  AS check 
    ON data.x = check.x 
    AND data.y = check.y 
    AND data.z = check.z 
WHERE 
    x = @x 
    AND check.x IS NULL 


OR

SELECT 
    * 
FROM 
    MyTable         AS data 
WHERE 
    x = @x 
    AND NOT EXISTS (
        SELECT 
        * 
        FROM 
        UpdateMyTable  AS check 
        WHERE 
         data.x = check.x 
        AND data.y = check.y 
        AND data.z = check.z 
       ) 
+0

SQLServerがこの最適化を自動的に提供するかどうかはわかりませんが、サブクエリでインデックスのみのアクセス権を得るには 'SELECT * 'を' SELECT' 1 'のように変更してください( 'x'、 yおよびzは適切に索引付けされます)。問合せはレコード全体にアクセスしません。 –

+0

これはSQL Serverの問題ではありません。 – MatBailie

+0

LEFT JOINを使用する必要があります。これらのレコードをEXISTSバージョンのレコードを使用して更新するためです。ありがとうございます! – Slee

1

あなたは代わりにNOT INの結合を使用することができます。

SELECT * 
FROM MyTable t 
INNER JOIN UpdateMyTable u ON t.ManufacturerId = u.ManufacturerId 
WHERE t.ManufacturerId = @ManufacturerId 
AND t.ItemId != u.ItemId 
AND t.ItemId != u.ChildItemId 
+0

逆に直観的ではなく( 'INNER JOIN' - これらの行も含めています)、_yither_条件が一致したときに行を除外する効果があります。 –

+0

さらに、 'ManufactureId'のすべての行に対して、' UpdateMyTable'で一致しない行がたくさんあります。これは、レコードを除外することからはるかに離れて、1:たくさんの結合を作成し、すべてのレコードを大規模に複製することを意味します。 – MatBailie

関連する問題