首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL -为具有重复值的列集选择所有主键

SQL -为具有重复值的列集选择所有主键
EN

Stack Overflow用户
提问于 2015-07-11 07:29:06
回答 2查看 63关注 0票数 1

把表当作-

代码语言:javascript
复制
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、set udid有重复的值,具有不同的主键udid。那是,

代码语言:javascript
复制
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 |
+------+--------+--------+----+

我们有两个重复列的部门,方案,贝纳德,但与不同的主键(udid)。如何列出上述结果的udids?

预期表结构-

代码语言:javascript
复制
+------+--------+--------+----+-----+
| 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   |
+------+--------+--------+----+-----+
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-11 07:39:13

您需要“返回”到原始表,方法是对已被发现为重复的行进行筛选。

示例:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2015-07-11 07:41:22

您可以使用作为子查询列出的聚合查询,并使用exists调用包装它:

代码语言:javascript
复制
SELECT *
FROM   db a
WHERE  EXISTS (SELECT   b.dept, b.scheme, b.beneid
               FROM     db b
               WHERE    a.dept = b.dept AND 
                        a.scheme = b.scheme AND
                        a.beneid = b.beneid
               GROUP BY b.dept, b.scheme, b.beneid
               HAVING   COUNT(*) > 1)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31354623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档