2016-11-06 5 views
1

zurückkehren Wie würde ich eine Abfrage in SQLite konstruieren, die jede Zeile von einem TABLE1 wählt und wählt auch eine Zeile aus einem TABLE2 wo:Inner zwei Tabellen Join und größten Wert aus der zweiten Tabelle für jeden Eintrag in der ersten Tabelle

  • Es gibt eine Übereinstimmung zwischen einem id Wert von TABLE1, und;
  • Wenn mehr als eine id Übereinstimmung in TABLE2 vorhanden ist, wird nur der höchste Wert in einer anderen DATE Spalte zurückgegeben.

Hier ist die Tabelle Anordnung, die ich gerade habe. Der Wert in der r_identifier Spalte entspricht den t_id Wert in TABLE1:

TABLE1 ("Tanks")

+------+--------------+-------+ 
| t_id | t_name | t_vol | 
+------+--------------+-------+ 
| 1 | A Tank  | 23 | 
| 2 | Another Tank | 48 | 
+------+--------------+-------+ 

TABLE2 ("Lesungen")

+------+--------------+--------+---------+ 
| r_id | r_identifier | r_date | r_value | 
+------+--------------+--------+---------+ 
| 0 |   1 | 5000 |  5 | 
| 1 |   1 | 6000 |  7 | 
| 2 |   2 | 7000 |  4 | 
| 3 |   1 | 8000 |  3 | 
+------+--------------+--------+---------+ 

Und hier ist die Tabelle, die ich von meiner Abfrage zurückgeben möchte. Da es mehrere Einträge mit den r_identifier von 1, nur derjenige mit dem höchsten Wert in r_date sind zurückgegeben:

+------+--------------+-------+------+--------------+--------+---------+ 
| t_id | t_name | t_vol | r_id | r_identifier | r_date | r_value | 
+------+--------------+-------+------+--------------+--------+---------+ 
| 1 | A Tank  | 23 | 3 |   1 | 8000 |  5 | 
| 2 | Another Tank | 48 | 2 |   2 | 7000 |  4 | 
+------+--------------+-------+------+--------------+--------+---------+ 

Die nächstgelegene ich habe in der Lage gewesen, so weit zu verwalten, ist mit der folgenden Aussage, inspiriert von this answer :

Dies liefert die richtigen Werte, aber für nur einen "Tank" - der erste in der Tabelle.

bearbeiten Ich habe vergessen, in meiner ursprünglichen Frage zu erwähnen, dass ich jeden Wert in TABLE1 noch keine Einträge in TABLE2 wenn es abgerufen werden wollte, die einen entsprechenden Wert in der r_identifier Kolonne hatte. Mit Gordon Linoff's answer als Führung, obwohl ich in der Lage war, mit dem folgenden zu kommen, die gut funktioniert:

SELECT t.*, r.* 
FROM t LEFT OUTER JOIN 
r ON t._id=r_identifier 
WHERE 
    (r_date IS NULL) OR 
    (r_date=(SELECT MAX(r2.r_date) 
    FROM r r2 
    WHERE r.r_identifier=r2.r_identifier)); 
+0

Sie können den Grenzwert als Ihre Anforderung erhöhen, es gibt mehr als einen Wert zurück ...! als Limit 2 oder mehr – Shailesh

Antwort

1

Einer Methode ist eine WHERE Klausel mit einer korrelierten Unterabfrage zu verwenden, um das maximale Datum zu erhalten:

SELECT t.*, r.* 
FROM t INNER JOIN 
    r 
    ON t._id = r.r_identifier 
WHERE r.r_date = (SELECT MAX(r2.r_date) 
        FROM r r2 
        WHERE r.r_identifier = r2.r_identifier 
       ); 
Verwandte Themen