2012-03-29 23 views
0

Es gibt zwei Tabellen in einer Datenbank sagen Tabelle1 und Tabelle2 .. tabelle1 hat Spalten ip_address und application_name während table2 Spalten hat, ip_adresse, avg_cpu, ram_utilization, DatumVerwirrung in Nullwerte Abrufen Joins

Ich möchte alle abrufen die ip_address, avg_cpu (durchschnittliche CPU-Auslastung) für das Datum 2012-03-01 die Host-Anwendung 'my_system' ... wenn eine bestimmte IP-Adresse keinen avg_cpu-Wert hat ... sollte null für diese IP-Adresse zurückgegeben werden .. welche Änderungen sollte ich tun, um die folgende Abfrage zu erhalten Ergebnis ... bin verwirrt, da dies das erste Mal, dass ich neu bin verbindet

SELECT 
    `table1`.`ip_address`, 
    `table1`.`application`, 
    `table2`.`avg_cpu` 
from 
    `table1` 
    right outer join `table2` ON `table1`.`ip_address`=`table2`.`ip_address` 
where 
    `table2`.`date`='2012-03-01' 
    and `table1`.`application`='My_System' 

Antwort

1

Ich bin mir sicher, wenn ich Ihre Frage verstehe, aber es klingt, als ob Sie vielleicht "linker äußerer Join" versuchen würden, der Zeilen enthält, für die das Join-Prädikat nicht passt ... in diesem Fall die Werte von rechts Seite des Joins wird NULL sein

+0

auf Links außen versucht, einen der ip_adresse beitreten, die nicht angezeigt nicht avg_cpu utilzation Wert in table2 haben war ... ist, dass ip_adresse in table1 und nicht in table2 – Pramod

+0

Wie HLGEM unten erwähnt, liegt das Problem in Ihre Wo-Klausel. Die linke Verknüpfung enthält eine Zeile für die IP-Adresse, die in Tabelle 2 fehlt, wird dann aber von Ihrer WHERE-Klausel herausgefiltert, da das Datum null ist und daher nicht mit '2012-03-01' übereinstimmt. Probieren Sie die Klausel "(' table2'.date' = '2012-03-01' ODER 'table2'.date' ist NULL) und ..." um zu sehen, was ich meine. – RyanHennig

1

Sind Sie sicher, dass Sie eine äußere Verbindung benötigen? Wenn ja, dann sollten Sie Ihre Abfrage wie folgt aussehen:

SELECT 
    `table1`.`ip_address`, 
    `table1`.`application`, 
    `table2`.`avg_cpu` 
from 
    `table1` 
    left join `table2` ON `table1`.`ip_address`=`table2`.`ip_address` and `table2`.`date`='2012-03-01' 
where 
    `table1`.`application`='My_System' 

beachten Sie, dass ich geändert rigth registrieren LEFT JOIN und bewegt den table2 Zustand auf den Abschnitt (dies für/links erforderlich ist, direkt verbindet, sonst arbeiten sie als innere Joins)

0

Wenn ich Bedürfnisse understandyour richtig ich denke, das funktioniert:

SELECT 
    `table1`.`ip_address`, 
    `table1`.`application`, 
    `table2`.`avg_cpu` 
FROM  `table1`  
LEFT OUTER JOIN `table2` 
    ON `table1`.`ip_address`=`table2`.`ip_address` 
     AND `table2`.`date`='2012-03-01'  
WHERE `table1`.`application`='My_System' 

LIke @RyanHenning, ich glaube, meinen Sie einen LEFT JOIN kein Recht kommen, so habe ich den Code entsprechend angepasst. Beachten Sie, dass Sie, obwohl Sie die Wörter rechts äußerer Join in Ihrem Original hatten, tatsächlich keinen äußeren Join hatten, da Sie bestimmte Bedingungen in der Where Clasue angeben, die von der Tabelle auf der linken Seite des Joins erfüllt werden musste. Ich denke auch, dass Sie diesen Link hilfreich finden können, um zu verstehen, warum die WHERE-Klausel falsch war. http://wiki.lessthandot.com/index.php/WHERE_conditions_on_a_LEFT_JOIN