2017-12-13 8 views
0

Tabellen Beteiligter: Konto, Benutzer, Service, accesshistSQL Join Problem mit 3 Tischen und eine Unterabfrage

ich alle Datensätze in der Kontentabelle enthalten sein soll, und nur die Daten aus den anderen Tabellen, wenn es vorhanden ist.

Graf von Konto: 5064

Zeilen aus Abfrage unten zurückgegeben: 4915

select u.last_name, u.first_name, a.username, ll.mxlogin, si.servicename, a.islockedout 
from account a 
join service si on a.serviceid = si.serviceid 
left outer join user u on u.loginid = a.username 
left outer join(select max(loginattemptdate) as MxLogin, usernameattempted from accesshist where isloginsuccessful = 1 
group by usernameattempted) ll 
on a.username = ll.usernameattempted 
where a.isenabled = 1 
order by ll.mxlogin, u.last_name 

Ich habe es verengt, dass die Unterabfrage beitreten das Teil die Anzahl der Zeilen verursacht reduziert werden, aber Ich bin mir nicht sicher, wie ich es korrigieren kann. Jede Einsicht wird sehr geschätzt!

Antwort

0

Haben Sie versucht, die erste Verbindung zu einer linken äußeren Verbindung zu ändern?

select u.last_name, u.first_name, a.username, ll.mxlogin, si.servicename, a.islockedout 
    from account a 
    left outer join service si on a.serviceid = si.serviceid 
+0

Ich könnte, aber es macht keinen Unterschied. Es gibt nur 4 Service-Codes und die Service-Code-Spalte hat eine Null-Einschränkung in der Account-Tabelle. – 90mph

+0

Ich würde einfach anfangen, das Problem zu vereinfachen. Entfernen Sie die Unterauswahl und verbinden Sie sich einfach mit accesshist. Alle Joins zum linken äußeren Join ändern Entfernen Sie ll.mxlogin, die where-Klausel und order by. –