2012-04-02 4 views
2

Ich möchte links Join 2 Tabellen. Also alle Attribute der linken Tabelle sollten in der Ergebnistabelle angezeigt werden, egal ob sie sich mit anderen Tabellen verbinden kann oder nicht.MySQL Links Join funktioniert nicht richtig

Wenn ich die follwing tun, nicht, daß ich das erwartete Ergebnis erhalten

week_table: 
date  kw note 
---------- -- ---- 
2012-04-01 0 NULL 
2012-04-02 0 NULL 

fact_table: 
id number_of_application number_of_cluster number_of_jvm number_of_node number_of_was fk_wasversion fk_date fk_domain fk_osname fk_osarch fk_osversion fk_stage 
-- --------------------- ----------------- ------------- -------------- ------------- ------------- ---------- --------- --------- --------- ------------ -------- 
    1     114     8   80    18   18 6.0   2012-04-01 domain1 Linux  sparc  2   stage1 
    2     114     8   80    18   18 6.0   2012-04-02 domain1 Linux  sparc  2   stage1 
    3     114     8   80    18   18 6.0   2012-04-01 domain1 AIX  sparc  2   stage1 
    4     114     8   80    18   18 6.0   2012-04-02 domain1 Solaris sparc  2   stage1 

Wenn ich dies tun:

select 
    w.date, 
    coalesce(sum(f.number_of_was), 0) 
from 
    week_table w 
    left join fact_table f on (w.date = f.fk_date) 
where f.fk_osname = "AIX" 
group by w.date; 

erhalte ich nur:

date  coalesce(sum(f.number_of_was), 0) 
---------- --------------------------------- 
2012-04-01        18 

Erwartet:

date  coalesce(sum(f.number_of_was), 0) 
---------- -------------------------------- 
2012-04-02       18 

Weiß jemand warum?

Mit freundlichen Grüßen

Antwort

11

die Kriterien Verschieben auf der äußeren verknüpften Tabelle aus der WHERE-Klausel der Klausel ON:

select 
    w.date, 
    coalesce(sum(f.number_of_was), 0) 
from 
    week_table w 
    left join fact_table f on (w.date = f.fk_date and f.fk_osname = "AIX") 
group by w.date; 
+0

danken Ihnen sehr viel zu tun - das funktioniert – veote

0
where f.fk_osname = "AIX" 

Ich denke, es mit diesem osname nur ein Datensatz ist?

0

wegen where f.fk_osname = "AIX"

, wenn die Daten doesnt auf der rechten Tabelle vorhanden sind, ist es NULL ist, und Sie fordern nur die Zeilen abzurufen, wo fk_osname ist = „AIX“ `

Sie WHERE (f.fk_osname = "AIX" OR f.fk_osname IS NULL)

+0

das funktioniert auch nicht, aber die Antwort von Ike Walker funktioniert gut – veote