将表格视为-
mysql> SELECT * FROM DB;
+------+--------+------+------------+---------+
| UDID | BENEID | DEPT | SCHEME | NAME |
+------+--------+------+------------+---------+
| 1 | 55 | TCS | RC | SHELLY |
| 2 | 95 | TCS | RC | BOB |
| 3 | 75 | TCS | RC | ULRICH |
| 4 | 55 | TCS | RC | SHELLY |
| 5 | 85 | TCS | FS | SHELLY |
| 6 | 65 | DSSP | ABC | BOB |
| 7 | 65 | DSSP | ABC | BOB |
| 8 | 75 | DSSP | ABC | ULRICH |
+------+--------+------+------------+---------+
beneid、dept 和scheme 列的集合有重复的值,具有不同的主键、udid。也就是说,
mysql> SELECT DEPT, SCHEME, BENEID, COUNT(*) AS CN FROM DB GROUP BY 1, 2, 3 HAVING CN >1;
+------+--------+--------+----+
| DEPT | SCHEME | BENEID | CN |
+------+--------+--------+----+
| DSSP | ABC | 65 | 2 |
| TCS | RC | 55 | 2 |
+------+--------+--------+----+
我们有 2 个重复的 dept、scheme、beneid 列,但具有不同的主键 (udid)。 我如何列出上述结果的 udid?
预期的表结构-
+------+--------+--------+----+-----+
| DEPT | SCHEME | BENEID | CN | UDID|
+------+--------+--------+----+-----+
| DSSP | ABC | 65 | 2 | 6 |
| DSSP | ABC | 65 | 2 | 7 |
| TCS | RC | 55 | 2 | 1 |
| TCS | RC | 55 | 2 | 4 |
+------+--------+--------+----+-----+
最佳答案
您需要“返回”原始表,方法是过滤此表中您发现的重复行。
例子:
SELECT DB.DEPT, DB.SCHEME, DB.BENEID, DUPS.CN, DB.UID
FROM DB
INNER JOIN
(
SELECT DEPT, SCHEME, BENEID, COUNT(*) AS CN
FROM DB GROUP BY 1, 2, 3 HAVING CN >1
) AS DUPS ON DB.DEPT = DUPS.DEPT
and DB.SCHEME = DUPS.SCHEME
and DB.BENEID = DUPS.BENEID
关于mysql - SQL - 为具有重复值的列集选择所有主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31354623/