sql - 合并和缩短两个 where 子句条件

标签 sql sql-server

架构:

CREATE TABLE #exclGeoKeys (xKEY INT);
INSERT INTO #exclGeoKeys
    values
    (1),
    (2);

CREATE TABLE #y (NAME CHAR(1),xKEY INT);
INSERT INTO #y
    values
    ('A',1),
    ('C',2),
    ('D',NULL),
    ('E',3),
    ('F',4);

我可以缩短以下内容以产生相同的结果并且不需要 OR xKEY IS NULL 部分吗?

SELECT *
FROM   #y
WHERE  xKEY NOT IN 
                 (
                 SELECT * 
                 FROM #exclGeoKeys
                 ) 
       OR 
       xKEY IS NULL;

最佳答案

将选项与 NOT EXISTS 结合使用运算符(operator)

SELECT *
FROM #y t
WHERE NOT EXISTS (
                  SELECT 1
                  FROM #exclGeoKeys t2
                  WHERE t.xKEY = t2.xKEY
                  )

演示 SQLFiddle

带有 EXISTS 和 EXCEPT 运算符的选项

SELECT *
FROM #y t
WHERE EXISTS (
              SELECT t.xKEY
              EXCEPT
              SELECT t2.xKEY
              FROM #exclGeoKeys t2
              )

带有 NOT EXISTS 和 INTERSECT 运算符的选项

SELECT *
FROM #y t
WHERE NOT EXISTS (
                  SELECT t.xKEY
                  INTERSECT
                  SELECT t2.xKEY
                  FROM #exclGeoKeys t2
                  )

关于sql - 合并和缩短两个 where 子句条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16218455/

相关文章:

mysql - SQL 查询 - 尝试使用 AND/OR 和 JOINS 根据特定条件显示结果

php - 我想根据另一个表中的内容从一个表返回数据?

php - Json 和图像

sql - 需要窗口函数来对空值和非空值进行排序

sql - SQL Server中的BCP导致错误

mysql - SQL 在 GROUP BY 中显示最近的记录?

sql - createQueryBuilder IN 子句

sql - 甲骨文 SQL ORA-00937 : not a single-group group function

sql - 使 SQL SERVER 以特定顺序评估子句

sql - TSQL 将 HHMMSS 的 VARCHAR 转换为 TIME