【问题标题】:Inner Join two tables and return greatest value from second table for each entry in first table内部连接两个表并从第二个表中为第一个表中的每个条目返回最大值
【发布时间】: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 |
+------+--------------+--------+---------+

这是我想从查询中返回的表。因为1r_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 或更多

标签: android sql sqlite


【解决方案1】:

一种方法是使用带有相关子查询的WHERE 子句来获取最大日期:

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
                 );

【讨论】:

    猜你喜欢
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 2021-04-28
    • 2019-03-18
    • 1970-01-01
    相关资源
    最近更新 更多