0

我有一个非常大的 sql 语句,我必须对其进行修改。在其中一个表中有四个 int 列,我必须排除 2 个集合。如果我只想排除一个表的值,这很简单,请使用 except 语句。我可以做这个:

select *
from Table Z
except(
select *
from Table Z
where (A= 2 and B= 10 and C= 3 and D= 90) 
or (A= 2 and B= 17 and C= 100 and D= 90))

但是我无法使用 where 语句让它工作。我只希望排除这两组组合。在真实的语句中,有一个连接六个不同的表和 select 中的各种 case 语句。

我已经尝试了一些东西,但似乎没有任何效果。

任何想法将不胜感激!

谢谢!

4

5 回答 5

4

为什么复杂EXCEPT?这不起作用吗?:

SELECT  *
FROM Table Z
WHERE NOT (  ( A= 2 and B= 10 and C= 3 and D= 90) 
          OR ( A= 2 and B= 17 and C= 100 and D= 90)
          )
于 2012-05-21T15:43:40.857 回答
1

只需使用NOT运算符:

SELECT * 
  FROM Table Z 
 WHERE NOT ((A = 2 and B = 10 and C = 3 and D = 90)  
            OR (A = 2 and B = 17 and C = 100 and D = 90))

或者,应用德摩根定律

SELECT * 
  FROM Table Z 
 WHERE (NOT (A = 2 and B = 10 and C = 3 and D = 90))
   AND (NOT (A = 2 and B = 17 and C = 100 and D = 90))
于 2012-05-21T15:44:16.347 回答
0

尝试不要在例如

SELECT * FROM Table1 WHERE Table1.ID NOT IN (SELECT ID FROM Table1 WHERE Somewhereclause)

在你的情况下:

select *
from Table Z
WHERE Z.ID NOT IN (
select ID
from Table Z
where (A= 2 and B= 10 and C= 3 and D= 90) 
or (A= 2 and B= 17 and C= 100 and D= 90))
于 2012-05-21T15:43:21.703 回答
0

这里有两种方法:

SELECT * FROM TABLE Z 
    WHERE Z.ID NOT IN 
    (SELECT ID FROM TABLE Z WHERE (A= 2 AND B= 10 AND C= 3 AND D= 90) OR (A= 2 AND B= 17 AND C= 100 AND D= 90))

第二种方式可能会表现得更好......不是 IN 可能有问题:

SELECT * FROM TABLE Z
    LEFT JOIN TABLE Z2
    ON 
    Z.Id = Z2.ID
    WHERE (Z2.A= 2 AND Z2.B= 10 AND Z2.C= 3 AND Z2.D= 90) OR (Z2.A= 2 AND Z2.B= 17 AND Z2.C= 100 AND Z2.D= 90)) WHERE Z2 IS NOT NULL

密切关注第二个...我不是 100% 确定它。我会先尝试第一个,如果你有性能问题,只使用第二个。

于 2012-05-21T15:44:37.883 回答
0

这将为您提供与示例查询相同的结果,并且只需要一个 SELECT 语句。

SELECT *
FROM Table_Z
WHERE NOT (A= 2 and B= 10 and C= 3 and D= 90) 
   AND NOT (A= 2 and B= 17 and C= 100 and D= 90)
于 2012-05-21T15:47:45.180 回答