2017-03-17 8 views
1

特定の組み合わせを除外するクエリがあります。この場合、ラウンドIDと名前の両方が指定した値と一致するレコードは必要ありません。特定の値の組み合わせを除外する句

残念ながら、私のクエリは、一方または他方(括弧にかかわらず)を持つ結果を除外します。両方の変数に '!='を使用すると、括弧内に予期しない結果が得られることに気づいた。

誰かが両方の基準に一致するもののみを除外するようにクエリを調整するのを手助けできますか?なぜ私がやっていることが間違っているのかについての説明もまた評価されるでしょう。私はラウンドIDと名前の両方が、私が指定した値に一致するレコードを望んでいないこの場合

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) --it basically ignores my parenthesis 
+0

サンプルデータを表示してください。 – Siyual

答えて

1

を(私は、テーブル名を変更する必要がありましたが、うまくいけば、それはまだ読めるのです)。両方の条件のため=

変更!=だけそれは(5月

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

を追加し、追加のマッチパラメータの一つだけ結果が含まれるように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 
) 

であなたの括弧の前にまたはあなたのwhere条件について考えてみましょう)Logic gates

ご質問の前提は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 | 
+---+---+----------+ 
+0

申し訳ありませんが、私は説明の最も重要な部分を台無しにしました –

+0

@JMariña更新 – SqlZim

+0

ありがとうございました。あなたが「not」が適切である理由を説明するリソースを私に指摘できれば、それは評価されるでしょう! –

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 
関連する問題