2011-11-15 52 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是否會自動提供這種優化,但是_may_通過將'SELECT *'更改爲'SELECT'1''這樣的子查詢來獲得索引訪問權限(只要'x','' y'和'z'被適當地索引) - 查詢將不會訪問整個記錄。 –

+0

這在SQL Server中不是問題。 – MatBailie

+0

我必須使用LEFT JOIN,因爲我將使用這些記錄在記錄上使用EXISTS版本進行更新 - 謝謝! – Slee

1

你可以使用JOIN代替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' - 因此我們包括這些行,對嗎?),這會在_either_條件匹配時排除行,而不是_both_。 –

+0

此外,對於'ManufactureId'中的每一行,在'UpdateMyTable'中將有很多行不匹配。這意味着遠不排除任何記錄,它將創建1:多聯接並大量複製每條記錄。 – MatBailie