Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有串联AND语句的SQL查询_Sql_Sql Server - Fatal编程技术网

带有串联AND语句的SQL查询

带有串联AND语句的SQL查询,sql,sql-server,Sql,Sql Server,我需要一个条件的反面: SELECT TAX.* FROM TAX JOIN STATUS ON TAX.TAX_ID = STATUS.TAX_ID WHERE STATUS.VALUE = 'ACTIVE' OR (STATUS.VALUE = 'COLLECTED' AND STATUS.COLLECTEDDATE >= '20000101') 我想要的是不符合where子句的记录 我试过了 SELECT TAX.* FROM TAX JOIN STATUS on TAX

我需要一个条件的反面:

SELECT TAX.* 
FROM TAX
JOIN STATUS ON TAX.TAX_ID = STATUS.TAX_ID
WHERE STATUS.VALUE = 'ACTIVE'
   OR (STATUS.VALUE = 'COLLECTED' AND STATUS.COLLECTEDDATE >= '20000101')
我想要的是不符合where子句的记录

我试过了

SELECT TAX.* 
FROM TAX
JOIN STATUS on TAX.TAX_ID = STATUS.TAX_ID
WHERE STATUS.VALUE != 'ACTIVE'
  AND (STATUS.VALUE != 'COLLECTED' and STATUS.COLLECTEDDATE < '20000101')
选择税务。*
税款
加入TAX.TAX\u ID上的状态=STATUS.TAX\u ID
其中STATUS.VALUE!='主动的
和(STATUS.VALUE!='COLLECTED'和STATUS.COLLECTEDDATE<'20000101')
但我好像丢失了记录。我认为SQL Server会删除记录,我怀疑它会删除括号

我能得到一个关于如何进行的建议吗

谢谢

两种方式

  • 在一开始就添加一个,如下图所示
  • 因此,您的查询将变为

    Select TAX.* from TAX
    JOIN STATUS on TAX.TAX_ID = STATUS.TAX_ID
    WHERE NOT
    (STATUS.VALUE = 'ACTIVE'
    OR (STATUS.VALUE = 'COLLECTED' and STATUS.COLLECTEDDATE >= '20000101'))
    
    Select TAX.* from TAX
    JOIN STATUS on TAX.TAX_ID = STATUS.TAX_ID
    WHERE STATUS.VALUE != 'ACTIVE'
    AND (STATUS.VALUE != 'COLLECTED' or STATUS.COLLECTEDDATE < '20000101')
    
  • 另一种方法是使用逻辑运算否定,它表示!(a+b)=!A.b还有!(a.b)=!a+!b
  • 因此,您的查询将变为

    Select TAX.* from TAX
    JOIN STATUS on TAX.TAX_ID = STATUS.TAX_ID
    WHERE NOT
    (STATUS.VALUE = 'ACTIVE'
    OR (STATUS.VALUE = 'COLLECTED' and STATUS.COLLECTEDDATE >= '20000101'))
    
    Select TAX.* from TAX
    JOIN STATUS on TAX.TAX_ID = STATUS.TAX_ID
    WHERE STATUS.VALUE != 'ACTIVE'
    AND (STATUS.VALUE != 'COLLECTED' or STATUS.COLLECTEDDATE < '20000101')
    
    从TAX中选择TAX.*
    加入TAX.TAX\u ID上的状态=STATUS.TAX\u ID
    其中STATUS.VALUE!='主动的
    和(STATUS.VALUE!='COLLECTED'或STATUS.COLLECTEDDATE<'20000101')
    
    更改回
    。所以<代码>WHERE STATUS.VALUE!='ACTIVE'或(STATUS.VALUE!='COLLECTED'和STATUS.COLLECTEDDATE<'20000101')如果您想精确地反转子句,为什么不将其包装在
    not(…)
    中,而不是自己费力地反转所有运算符?速度首选的运算符之一?@arcee123作为not()的第二个运算符将处理()@DhruvJoshi:我真诚地怀疑这是正确的,当有疑问时,答案通常是“试试看”。优化器可以自由重写任何一个查询,由于否定的条件,这两个查询都不能有效地使用索引,因此,如果确实存在差异,我会感到惊讶。@Jeroenmoster我同意!这取决于索引和计划中展开的内容