将连接查询中的重复值限制为仅显示第一个实例

Posted

技术标签:

【中文标题】将连接查询中的重复值限制为仅显示第一个实例【英文标题】:Limit duplicated values in joined query to show only for first instance 【发布时间】:2021-10-25 21:13:27 【问题描述】:

我以查询返回的方式连接两个表:

parent.name child.name child.col
First A foo
Second A foo
Third A foo
Fourth B bar
Fifth C baz
Sixth C baz

我只需要child.col 字段中的数据首次出现即可。 我尝试过使用 windows 或按child.name 分组并合并除第一行之外的所有内容,但我想到的最简单的解决方案是像这样计算每个唯一子项的索引:

parent.name child.name child.col instance
First A foo 1
Second A foo 2
Third A foo 3
Fourth B bar 1
Fifth C baz 1
Sixth C baz 2

然后我可以使用 case 语句仅在 instance == 1 时显示 child.col 值。

我不知道如何实现这一点。我正在处理的真正查询是怪物,所以我必须展示的唯一代码是我为创建上述示例而编写的简单代码:

SELECT parent.name, child.name, child.col
FROM parent, child
WHERE parent.match = child.match

【问题讨论】:

【参考方案1】:

首先,学习使用正确、明确、标准、可读的JOIN语法。

其次,你可以使用row_number()case

SELECT p.name,
       (CASE WHEN ROW_NUMBER() OVER (PARTITION BY c.name ORDER BY p.name) = 1
             THEN c.name
        END) as name,
       (CASE WHEN ROW_NUMBER() OVER (PARTITION BY c.name ORDER BY p.name) = 1
             THEN c.col
        END) as col
FROM parent p JOIN
     child c
     ON p.match = c.match
ORDER BY c.name, p.name;

请注意,需要外部聚合以确保每个组中的“第一”行具有值。

【讨论】:

1) 这是一个简单的例子,真正的查询使用大男孩连接,但感谢您让我知道。 2)谢谢,这比我预期的要容易得多?️

以上是关于将连接查询中的重复值限制为仅显示第一个实例的主要内容,如果未能解决你的问题,请参考以下文章

减少多值连接 SQL 查询中的重复记录

sql中如何使一列中的多个重复数据只显示第一条

连接查询以获取多个数据到 laravel 中的数据表

将字符串与MySQL中的字段值连接[重复]

sql限制无法显示第一行[重复]

MySQL - 数据查询语言DQL数据连接语法及实例