📅  最后修改于: 2023-12-03 15:20:17.315000             🧑  作者: Mango
在 SQL 中,我们可以使用 GROUP BY
和 HAVING
子句来筛选重复项。但如果我们要根据两列来选择重复项,该怎么办呢?本文将介绍如何在 SQL 中根据两列选择重复项。
如果我们只需要根据一列选择重复项,可以使用 GROUP BY
和 HAVING
子句:
SELECT column_name, COUNT(*)
FROM table_name
GROUP BY column_name
HAVING COUNT(*) > 1;
这条语句将根据 column_name
列选择重复项,并输出每个重复项出现的次数。如果你不需要知道每个重复项出现的次数,也可以像下面这样简化语句:
SELECT column_name
FROM table_name
GROUP BY column_name
HAVING COUNT(*) > 1;
但如果我们需要根据两列选择重复项,就不能这么简单了。
我们可以通过使用子查询来实现根据两列选择重复项的目的。具体做法是,先使用 GROUP BY
和 HAVING
子句根据两列选择出重复项,然后将结果作为子查询,在主查询中使用 IN
子句将其与原表连接起来。例如:
SELECT *
FROM table_name
WHERE (column_1, column_2) IN (
SELECT column_1, column_2
FROM table_name
GROUP BY column_1, column_2
HAVING COUNT(*) > 1
);
这条语句将根据 column_1
和 column_2
列选择重复项,并输出这些重复项在原表中的所有列。如果你只需要输出某些列的值,可以在主查询中指定这些列:
SELECT column_name1, column_name2
FROM table_name
WHERE (column_1, column_2) IN (
SELECT column_1, column_2
FROM table_name
GROUP BY column_1, column_2
HAVING COUNT(*) > 1
);
需要注意的是,这种做法可能会比较慢,因为需要进行两次查询。如果你的表比较大,可能需要想办法优化。例如,你可以先创建一个有两列的虚拟表,将需要选择的两列的值插入到该表中,然后使用 JOIN
或者 EXISTS
子句来连接表。但这种做法比较繁琐,如果不是必要的,建议不要使用。