Sql 在两列中选择没有特定值的记录

Sql 在两列中选择没有特定值的记录,sql,sql-server,Sql,Sql Server,我需要在两列中选择一些没有特定值的行。目前,我通过执行以下操作来为单个列执行此操作: SELECT * FROM MyTable WHERE (ManufacturerID = @ManufacturerID) AND ItemID NOT IN( SELECT ItemID FROM UpdateMyTable WHERE ManufacturerID=@ManufacturerID ) 但是现在我需要过滤掉不同时包含两个列值的行:ItemID和Chil

我需要在两列中选择一些没有特定值的行。目前,我通过执行以下操作来为单个列执行此操作:

SELECT *
FROM MyTable
WHERE    (ManufacturerID = @ManufacturerID)
    AND ItemID NOT IN(
        SELECT ItemID FROM UpdateMyTable WHERE ManufacturerID=@ManufacturerID
    )
但是现在我需要过滤掉不同时包含两个列值的行:ItemID和ChildItemID

我将如何做到这一点

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


您可以使用JOIN而不是notin

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

你能发布你的表格模式吗?我不太容易理解您的问题。使用NULL检查空值如何?我不确定SQLServer是否会自动提供此优化,但您可以通过将SELECT*更改为类似SELECT“1”的方式在子查询中获得索引访问权,只要x,y,和z被适当地索引-查询将不会访问整个记录。这在SQL Server中不是问题。我必须使用左连接,因为我将使用这些记录使用此的现有版本来执行和更新记录-谢谢!除了违反直觉的内部连接-所以我们包括这些行,对吗?当任一条件匹配时,这有排除行的效果,而不是两者都匹配。此外,对于ManufactureId中的每一行,在UpdateMyTable中会有许多不匹配的行。这意味着,它不仅不会排除任何记录,还将创建一个1:many连接并大量复制每个记录。
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