如何连接表以选择连接表中的最大行? [复制]

Posted

技术标签:

【中文标题】如何连接表以选择连接表中的最大行? [复制]【英文标题】:How do I join tables to choose the maximum row in the joined table? [duplicate] 【发布时间】:2018-06-29 04:54:11 【问题描述】:

我有两个表,我想在一个属性上将它们连接起来,但我不想在第二个表中获取所有匹配的行,我只想选择具有最高数字(最新日期等)的条目某列。我如何在 SQL 中表达这个结果?

这里有一个简化的例子来澄清我的问题。

Table `colors`
| color |
+-------+
| red   |
| green |
| blue  |


Table `inventory`
| color | value | shape    |
+-------+-------+----------|
| red   | 1     | square   |
| red   | 2     | circle   |
| green | 7     | triangle |


Desired output:
| color | value | shape    |
+-------+-------+----------|
| red   | 2     | circle   |
| green | 7     | triangle |
| blue  | NULL  | NULL     |

我的表相当大,因此理想情况下,解决方案会相当有效。 (不需要微调,只是尽量避免可能变得巨大的双重连接。)

【问题讨论】:

【参考方案1】:

http://sqlfiddle.com/#!9/0b75c/6

SELECT c.*, i.value, i.shape
FROM colors c
LEFT JOIN inventory i
ON c.color = i.color
LEFT JOIN inventory i_
ON i.color = i_.color
  AND i.value<i_.value
WHERE  i_.color IS NULL

http://sqlfiddle.com/#!9/0b75c/8

SELECT i.value, i.shape
FROM inventory i
LEFT JOIN inventory i_
ON i.color = i_.color
  AND i.value<i_.value
WHERE  i_.color IS NULL

【讨论】:

是的,这行得通。但是有没有办法避免双重连接? 如果您不介意在结果中丢失blue。在这种情况下,您可以有 1 个自我加入。 我可以忍受掉蓝色(我总是可以UNION 它回来),但我想避免将库存加入到自身中。如果有 100k 个条目,中间表将有 100 亿个条目... 这个连接应该比联合快得多 @Charles 关系数据库非常擅长连接,这就是“关系”部分。如果 colorvalue 被索引(颜色应该作为一个键),它会做一些比暴力 100 亿操作更有效的事情。【参考方案2】:
select c.color, i2.value, i2.shape
from colors c
left join 
(
   select color, max(value) as value
   from inventory 
   group by color
) i on c.color = i.color
left join inventory i2 on i2.color = i.color
                      and i2.value = i.value

【讨论】:

这行得通,但是有没有办法避免双重连接? @Charles 双连接可能不会是性能问题。 color 将被索引为外键和主键,因此两个连接都将非常快。索引value 可能会加快子选择。 @Charles 为了提高性能,您可以将子选择替换为materialized view,基本上是子查询的缓存,看起来像一个表。它还使查询更易于阅读,而不是像任何其他表一样加入您要加入视图名称的子查询,可能是best_colors。但是 mysql 不支持物化视图。但是,您可以创建自己的 summary tables 并根据数据的性质以各种方式对其进行更新。

以上是关于如何连接表以选择连接表中的最大行? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

连接sql表以选择连接表中不存在的记录[重复]

如何从 SQL 表中选择特定行并连接 SQL 服务器中的多个表?

如何连接表中的最新行?

如何在实体框架中的两个表之间进行左连接操作时从左表中选择唯一行

基于第一个表中的值的连接表中的最大值

如何使用第一个表中的逗号分隔值从另一个表中选择行? [复制]