【发布时间】:2016-11-06 15:20:37
【问题描述】:
如何在 SQLite 中构造一个查询,从 TABLE1 中选择每一行,并从 TABLE2 中选择一行,其中:
-
id值与来自TABLE1的值匹配; - 如果
TABLE2中有多个id匹配,则仅返回另一个DATE列中的最大值。
这是我现在的餐桌布置。 r_identifier 列中的值对应TABLE1 中的t_id 值:
TABLE1(“坦克”)
+------+--------------+-------+
| t_id | t_name | t_vol |
+------+--------------+-------+
| 1 | A Tank | 23 |
| 2 | Another Tank | 48 |
+------+--------------+-------+
TABLE2(“读数”)
+------+--------------+--------+---------+
| r_id | r_identifier | r_date | r_value |
+------+--------------+--------+---------+
| 0 | 1 | 5000 | 5 |
| 1 | 1 | 6000 | 7 |
| 2 | 2 | 7000 | 4 |
| 3 | 1 | 8000 | 3 |
+------+--------------+--------+---------+
这是我想从查询中返回的表。因为1的r_identifier有多个条目,所以只返回r_date中值最高的条目:
+------+--------------+-------+------+--------------+--------+---------+
| 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 |
+------+--------------+-------+------+--------------+--------+---------+
到目前为止,我能做到的最接近的是以下语句,其灵感来自this answer:
SELECT t.*, r.* FROM t INNER JOIN r ON t._id=r_identifier ORDER BY r_date DESC LIMIT 1
这会返回正确的值,但只针对一个“坦克”——表中的第一个。
编辑
我忘了在我原来的问题中提到我想检索TABLE1 中的每个 值,即使TABLE2 中没有在r_identifier 列中具有匹配值的条目。使用Gordon Linoff's answer 作为指导,虽然我能够想出以下工作良好的方法:
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));
【问题讨论】:
-
您可以根据您的要求增加限制值,它将返回多个值...!作为限制 2 或更多