【发布时间】:2023-03-19 18:24:01
【问题描述】:
我发现三个问题似乎都在问一个相似的问题:
Getting max value from rows and joining to another table
Select only rows by join tables max value
Joining tables based on the maximum value
但是当最大值位于 id 或索引字段本身时,我很难弄清楚如何准确地连接表,只保留其中一个表的最大行。
我正在寻找一个只需要连接的答案,因为这将允许解决方案在一个生成查询的工具中工作,很容易让它生成相应的连接,尽管子查询也可能是可行的用更多的努力。我发现下面的答案特别有趣:
SELECT DISTINCT b.id, b.filename, a1.name
FROM a a1
JOIN b
ON b.id = a1.id
LEFT JOIN a a2
ON a2.id = a1.id
AND a2.rank > a1.rank
WHERE a2.id IS NULL
但是,在我的情况下,排名列也是索引,例如“ID”。我不能同时比较相等和大于,因为它们永远不会同时为真!
此外,可能使情况复杂化的是,我需要的典型查询可能会连接多个表(3-5 并不少见)。因此,作为我的查询的简化示例:
SELECT
table1.field1, table1.field2, table1.field3,
table2.field1, table2.field2, table2.field3,
table3.field1, table3.field2, table3.field3,
table4.field1, table4.field2, table4.field3
FROM table1
INNER JOIN table2 ON
table1.field1 = table2.field1
AND table1.field2 = table2.field2
AND table2.field3 < 0
INNER JOIN table3 ON
table2.field1 = table3.field1
AND table2.field4 = table3.field4
INNER JOIN table4 ON
table1.field1 = table4.field1
AND table1.field2 = table4.field2
我想要做的是通过仅获取所有其他字段的每个唯一组合的具有最大 id 的行(例如 MAX(table3.id))来消除 table3 中的重复项。也就是说,上面的查询返回的是这样的:
+-------+-------+-------+---------+
| table1| table2| table4|table3 |
+-------+-------+-------+---------+
| A | A | A | 1,... |
| A | A | A | 2,... |
| A | A | A | 3,... |
| A | A | A | MAX2,...|
| B | B | B | 1,... |
| B | B | B | 2,... |
| B | B | B | 3,... |
| B | B | B | MAX2,...|
+-------+-------+-------+---------+
(我只是使用 A 和 B 来表示我正在谈论针对特定行集的 table1、table2 和 table4 中的字段的所有相同值。)
我想把它简化为:
+-------+-------+-------+---------+
| table1| table2| table4|table3 |
+-------+-------+-------+---------+
| A | A | A | MAX1,...|
| B | B | B | MAX2,...|
+-------+-------+-------+---------+
【问题讨论】:
-
SELECT table1.id, MAX(table3.field3) FROM (<query from above>) GROUP BY table1.id怎么样? -
@500-InternalServerError
SELECT table1.field1, table1.field2, table1.field3, table2.field1, table2.field2, table2.field3, table3.field1, table3.field2, table3.field3, table4.field1, table4.field2, table4.field3 table1.id, MAX(table3.field3) FROM (<query from above>) GROUP BY table1.id? -
样本数据最好使用DDL + DML。请edit您的问题包括它,您当前的尝试和您想要的结果。更多详情,read this.
-
@Michael 我认为应该是 SELECT table1.columns、table2.columns、table4.columns、MAX(table3.columns) 和 GROUP BY table1.columns、table2.columns、table4.columns。如果您不聚合 table3 中的所有列,则应将这些列放入 GROUP BY
-
@DávidLaczkó 我的理解是,某些数据库不能保证 MAX 和 GROUP BY 可以很好地协同工作以从同一行返回数据。例如,如果表 3 的 id、field1 和 field2 具有“3, A, RED”、“4, B, BLUE”、“5, C, WHITE”,则 MAX(id) 将返回 5,但 field1 和 field2值不保证是“C”和“WHITE”...
标签: sql sql-server tsql join