2010-12-09 9 views
1

Ich bin ein wenig verwirrt darüber, warum diese beiden SQL-Konstrukte nicht das gleiche Ergebnis liefern.sql join -vs- where-Klausel erzeugt nicht das gleiche Ergebnis?

SQL # 1 return 2 identische Datensätze (dups), wenn nur einer der Mängel-Tabelle vorhanden ist ... siehe nächste SQL

SELECT * 
FROM Defects d 
    JOIN StatusCode C ON C.CodeName = d.Status AND c.scid = 10 
WHERE d.AssignedTo='me' 

SQL # 2 Wiederholungen 1 Datensatz - das ist richtige Ursache lookign bei Rohdaten gibt es einen Mangel für ‚me‘ nicht geschlossen

SELECT * 
FROM Defects d 
WHERE d.AssignedTo='me' AND Status <> 'closed' 

alles, was ich tue, ist stattdessen ein negativ mit dem Status nicht in etwas, positiv über die Aufzeichnungen verbinden mit, die jeden Wert Defekt anderen Status haben als geschlossen

Warum passiert das und wie kann ich meine Auswahl mit der Verknüpfung ändern, um das Ergebnis zu korrigieren? Ich habe versucht, DISTINCT mit aber es funktioniert nicht mit:

Der Datentyp Ntext nicht als DISTINCT ausgewählt werden kann, weil es nicht vergleichbar ist.

gibt es keine Statuscodes, die 'geschlossen' werden, nicht ein einziger:

select * from StatusCode where scid = 10 

Ergebnisse in diesen Werten: Fest New Bereit Retest fehlgeschlagen Retest Qualität Follow Up Erneut öffnen Abgelehnt Consumer In Coding öffnen Feste New Bereit für Retest fehlgeschlagen Retest Qualität Follow Up Consumer Abgelehnt wieder öffnen Öffnen durch das In Coding

+1

Ich sehe, Sie haben ntext Felder in Ihrer Datenbank. Sie müssen anfangen, diese mit nvarchar (max) zu ersetzen, da ntext veraltet ist und nicht in der nächsten Version von SQL Server nach 2008 sein wird. – HLGEM

Antwort

1

Die innere Verknüpfung wird alle passende Kombinationen von Zeilen zurück, so muss es zwei Zeilen in der Statustabelle sein, die den „Status“ Wert Ihrer Defect entsprechen (und haben SCID = 10).

Fest
New
Bereit Retest
fehlgeschlagen Retest
Qualität Follow Up

Consumer Abgelehnt wieder öffnen

öffnen
Feste
New
Bereit Retest
fehlgeschlagen Retest
Qualität Follow Up
wieder öffnen
Abgelehnt Verbraucher In Coding
In Codierung
Öffnen

Nicht sicher, ob ich Ihre Liste analysiert habe genau richtig, aber da scheinen Duplikate zu sein. Die Antwort besteht also darin, entweder die Duplikate in der StatusCode-Tabelle zu eliminieren oder einen zusätzlichen Filter anzuwenden, um zwischen ihnen zu unterscheiden, wenn die Duplikate gültig sind.

+0

Sie sind richtig, so dass mein SQL-Denken korrekt war und die Daten für den Fehler fehlerhaft waren. guter Fang. tausend Dank! – kacalapy

1

Wie viele Zeilen zurückgegeben werden?

SELECT * FROM StatusCode C WHERE c.scid = 10 

Sie können daher dies tun wollen:

SELECT * 
FROM Defects d 
WHERE d.AssignedTo='me' AND d.Status IN (
    SELECT C.CodeName FROM StatusCode C WHERE C.scid = 10 
) 

Bearbeiten Sie Ihre bearbeiten Adresse: da Sie mit scid=10 mehrere Zustände haben, jede von denen an Ihre Reihen verbunden werden, was Warum bekommst du die Duplikate? Mein Codevorschlag ist jedoch noch gültig.

+0

die Verwendung des IN ist das selbe wie das Ausführen eines Joins, um unerwünschte Datensätze zu entfernen, richtig? Das heißt, Sie können ein IN verwenden ("Fixed", "New", "Ready for Retest" ....), um ein Ergebnis zu erhalten, das Fehler ausschließt, wo Status <> AKA geschlossen ist, wobei status = alle Optionen außer Closed. und sich dem gleichen Set anschließen, um einen Ausschluss zu erhalten. – kacalapy

+0

Der 'JOIN' erzeugt alle passenden Kombinationen, was nicht das ist, was Sie wollen. Das 'IN' andererseits, genau wie ein anderes 'WHERE'-Prädikat, gibt" true "zurück, wenn der angegebene Wert in der' IN() 'Menge enthalten ist. – Lucero

-2

Ich würde denken, das Problem hier ist:

JOIN StatusCode C ON C.CodeName = d.Status AND c.scid = 10 

Die c.scid = 10 sollte in der where-Klausel sein.

+1

Dies ist absolut als Join-Bedingung gültig, und da es ein innerer Join ist, bedeutet dies, dass nicht erfüllte Bedingungen die Zeile übersprungen werden, was (in diesem speziellen Fall) genau so ist wie in der WHERE-Klausel. – Lucero

Verwandte Themen