Where子句排除了特定的值组合

时间:2017-03-17 15:07:39

标签: sql sql-server

我有一个查询,我想要排除一组特定的组合。在这种情况下,我不希望记录中圆形ID和名称与我指定的值匹配。

不幸的是,我的查询排除了任何一个或另一个结果(尽管有括号)。我注意到,当两个变量都使用'!='时,我只会在括号内得到意想不到的结果(当一个或两个使用'='时,它会按预期尊重这两个条件。)

有人可以帮我调整查询,以便排除的唯一结果是那些符合这两个标准的结果吗?解释为什么我正在做的事情是错误的也将不胜感激。 (我不得不更改表名,但希望它仍然可读)

request.setAttribute("name", "value");

2 个答案:

答案 0 :(得分:1)

  

在这种情况下,我不希望记录中圆形ID和名称与我指定的值匹配。

将这两个条件的!=更改为=,并在括号前加上not

declare @rn varchar(20) = 'Value 1';
declare @round nvarchar(15) = 'Value 2';

select distinct 
    rfr.RFId
  , r2.name
  , dc.Code
  , r.RoundId
from review.RF rf
  inner join review.RFRound rfr
    on rfr.RFId = rf.RFId and isnull(rfr.IsDeleted, 0) = 0
  inner join review.Round r
    on r.RoundAutoId = rfr.RoundAutoId
  inner join dc.DeficiencyCode dc
    on dc.DeficiencyCodeId = rf.DeficiencyCodeId
  inner join review.SR sr
    on sr.SRId = rf.SRId
  inner join reftype.Review r2
    on r2.ReviewId = sr.ReviewId
where not (
      r.RoundId = @round 
    and r2.name = @rn
  )

要仅包含额外匹配其中一个参数的结果,请添加

 and (
      r.RoundId = @round 
    or r2.name = @rn
  )

根据Logic gates

,可能(或可能不)帮助您考虑where条件

您的问题的前提是您正在应用nand逻辑,这是not and的缩写,转换为not ( condition and condition )

NAND:

+---+---+----------+
| A | B | A NAND B |
+---+---+----------+
| 0 | 0 |        1 |
| 0 | 1 |        1 |
| 1 | 0 |        1 |
| 1 | 1 |        0 |
+---+---+----------+

答案 1 :(得分:0)

删除'!'从你的条件

DECLARE @rn VARCHAR(20) = 'Value 1'
DECLARE @round NVARCHAR(15) = 'Value 2'

SELECT DISTINCT rfr.RFId, r2.Name ,dc.Code, r.RoundId
FROM review.RF rf
JOIN review.RFRound rfr ON rfr.RFId = rf.RFId AND ISNULL(rfr.IsDeleted,0)=0
JOIN review.Round r ON r.RoundAutoId = rfr.RoundAutoId
JOIN dc.DeficiencyCode dc ON dc.DeficiencyCodeId = rf.DeficiencyCodeId
JOIN review.SR sr ON sr.SRId = rf.SRId
JOIN reftype.Review r2 ON r2.ReviewId = sr.ReviewId
WHERE r.RoundId = @round 
  AND r2.Name = @rn