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 vonTABLE1
, und; - Wenn mehr als eine
id
Übereinstimmung inTABLE2
vorhanden ist, wird nur der höchste Wert in einer anderenDATE
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));
Sie können den Grenzwert als Ihre Anforderung erhöhen, es gibt mehr als einen Wert zurück ...! als Limit 2 oder mehr – Shailesh