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.

War es hilfreich?

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

ermöglichen

Ä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, .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top