选择包含相同值的行

Posted

技术标签:

【中文标题】选择包含相同值的行【英文标题】:Select rows that contain the same values 【发布时间】:2021-07-20 02:58:55 【问题描述】:

我需要提取包含完全相同电影的 storeID 对,以该表为例

storeID movieID
1 a
1 b
1 c
2 a
2 b
2 c
3 d

结果查询应该是 storeID 1 和 storeID 2 因为它们共享相同的电影。

【问题讨论】:

【参考方案1】:

这个查询:

SELECT storeID, GROUP_CONCAT(movieID ORDER BY movieID) movies
FROM tablename
GROUP BY storeID

以逗号分隔列表的形式返回每个商店的所有电影。 将其用作 CTE 并通过 self join 获得具有相同电影的商店对:

WITH cte AS (
  SELECT storeID, GROUP_CONCAT(movieID ORDER BY movieID) movies
  FROM tablename
  GROUP BY storeID
)
SELECT c1.storeID storeID1, c2.storeID storeID2
FROM cte c1 INNER JOIN cte c2
ON c1.movies = c2.movies AND c1.storeID < c2.storeID 

【讨论】:

想象一下 10 个(或 100 个)storeID 具有相同的 movieID 列表...您的输出将太长。 @Akina 我需要提取包含完全相同电影的 storeID 对这是要求。 确实如此。也许这个变种真的更适合OP。【参考方案2】:
WITH cte AS ( SELECT storeID, GROUP_CONCAT(movieID ORDER BY movieID) movies
              FROM table 
              GROUP BY storeID )
SELECT GROUP_CONCAT(storeID) 
FROM cte
GROUP BY movies
HAVING COUNT(*) > 1

【讨论】:

以上是关于选择包含相同值的行的主要内容,如果未能解决你的问题,请参考以下文章

选择具有相同值的上次更新的行

如何使用窗口函数仅在 POSTGRES 中选择不超过某个值的行

SQL - 选择两列中具有相同值的行

根据另一列的字段值选择具有相同列值的行

如何从两个表中选择同一字段中具有相同值的行?

选择嵌套 JSON 数组包含特定值的行