Verstehe nicht, warum diese beiden Abfragen unterschiedliche Ergebnisse
-
19-09-2019 - |
Frage
Ich habe drei Tabellen (für Zwecke der Beweisführung) individuell, E-Mail und Attribut. individual_Ref des Fremdschlüssels, dass Links einzelne E-Mail und Attribut.
Es ist nicht erforderlich, dass ein Individuum gegeben auf der Attributtabelle dargestellt werden, da sie nie ein Attribut hinzugefügt hatten, und sie können mehr als einmal, wenn sie mehr als ein Attribut.
Ich möchte eine Liste der einzelnen Referenzen bekommen und eine Zählung eines bestimmten Attribut für sie. Aber müssen per E-Mail-Adresse suchen, wie es für den Einzelnen zu teilen E-Mail-Adressen erlaubt (versteh mich nicht begonnen) ...
Mein erster Stich war
select e.individual_ref, count(a.attr_Code_ref)
from email e left join attribute a on e.individual_Ref = a.individual_ref
where e.email_Address = 'example.email@adomain.net'
and a.attr_code_Ref = 4119
group by e.individual_ref
mit einem LEFT JOIN, um sicherzustellen, ich von E-Mail eine individuelle ref erhalten, wenn ein solches vorhanden ist und ich ein Ergebnis bekommen, um sicherzustellen, ob es eine einzelne ref in E-Mail, aber nicht in Attribute. Oder so dachte ich, da diese keine Zeilen zurückgibt, aber ...
select e.individual_ref,
(select count(a.attr_Code_ref) from attribute a where a.attr_code_Ref = 4119 and a.individual_ref = e.individual_ref)
from email e
where e.email_Address = 'example.email@adomain.net'
group by e.individual_REf
gibt eine Zeile mit einer individual_Ref und einer Zählung von 0
Ich schlage nicht vor SQL gebrochen ist mehr, dass mein Verständnis ist, ... so dass ich denke: „Was ist meine Verwirrung?“ ist die Frage.
Lösung
Wenn eine Unterabfrage auf einen LEFT JOIN
Umwandlung, die korrelierten WHERE
Bedingungen in der Unterabfrage geht auf die ON
Klausel der Verbindung, nicht auf die WHERE
-Klausel:
SELECT e.individual_ref, count(a.attr_Code_ref)
FROM email e
LEFT JOIN
attribute a
ON a.individual_ref = e.individual_Ref
AND a.attr_code_Ref = 4119
WHERE e.email_Address = 'example.email@adomain.net'
GROUP BY
e.individual_ref
Andere Tipps
der folgende Teil bewirkt, dass das zu ändern, verbinden:
from email e left join attribute a on e.individual_Ref = a.individual_ref
where e.email_Address = 'example.email@adomain.net'
and a.attr_code_Ref = 4119
Durch eine where-Klausel auf dem a.attr_code Platzieren Sie die links gedreht haben kommen in eine innere Verknüpfung z.B. wo kein Attribut Datensatz vorhanden ist, gibt es null, die die where-Klausel nicht. (Da a.attr_code_ref nicht 4119 sein kann, gab es keine Aufzeichnungen.)
Sie müßten a.attr_code_ref = 4199 or a.attr_code_ref is null
Ändern Sie die erste in:
select e.individual_ref, count(a.attr_Code_ref)
from email e left join attribute a on e.individual_Ref = a.individual_ref
where e.email_Address = 'example.email@adomain.net'
and (a.attr_code_Ref = 4119 or a.individual_ref is null)
group by e.individual_ref
und Sie erhalten die gleichen Ergebnisse
In der ersten Abfrage, Sie schließen sich die beiden Tabellen und suchen nach alle Zeilen, die entsprechen den beiden Ihre Bedingungen -. Es gibt keine
In der zweiten Abfrage, Sie sind die Zeilen aus der ersten Tabelle immer den entsprechen den E-Mail-Zustand (vorhanden), und die Anzahl der Zeilen, die entspricht Ihre zweite Bedingung aus der anderen Tabelle gibt es 0 von denen, .