2017-03-17 3 views
1

Ich habe eine Abfrage, die ich eine bestimmte Kombination von Kombinationen ausschließen möchte. In diesem Fall möchte ich keine Datensätze, bei denen sowohl die runde ID als auch der Name den angegebenen Werten entsprechen.Where-Klausel, die bestimmte Kombination von Werten ausschließt

Leider schließt meine Abfrage jedes Ergebnis aus, das das eine ODER das andere (trotz der Klammer) hat. Mir ist aufgefallen, dass ich innerhalb der Klammern nur dann unerwartete Ergebnisse erhalte, wenn für beide Variablen '! =' Verwendet wird (wenn einer oder beide '=' verwenden, berücksichtigt er beide Bedingungen wie erwartet).

Kann mir bitte jemand helfen, die Abfrage so anzupassen, dass nur die Ergebnisse ausgeschlossen sind, die beide Kriterien erfüllen? Eine Erklärung, warum das, was ich tue, falsch ist, würde auch geschätzt werden. (Ich hatte Tabellennamen zu ändern, aber hoffentlich ist es immer noch lesbar)

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

Bitte zeigen Sie Beispieldaten. – Siyual

Antwort

1

In diesem Fall will ich nicht Datensätze, bei denen sowohl die Runde ID und den Namen mit den Werten übereinstimmen I angeben.

ändern !=-= für beide Bedingungen und Ihre Klammern voranstellen 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 
) 

Um nur Ergebnisse enthalten, die zusätzliche Spiel nur einer der Parameter, fügen

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

Es kann (oder vielleicht nicht) helfen, über Ihre where Bedingungen in Bezug auf Logic gates

zu denken

Die Prämisse Ihrer Frage ist Ihre Anwendung einer nand Logik, die für not and kurz ist, die not (condition and condition) übersetzt.

NAND: '!'

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

Entschuldigung, ich vermasselt den wichtigsten Teil der Erklärung –

+0

@ JMariña Aktualisiert – SqlZim

+0

Vielen Dank, das hat funktioniert. Wenn Sie mich auf eine Ressource hinweisen können, die erklärt, warum das "nicht" angemessen ist, wäre es wünschenswert! –

0

entfernen von Ihrem wo Zustand

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 
Verwandte Themen