根据非重复列查找重复项

时间:2021-03-11 09:29:48

标签: sql

基于下表

id  name  cardId
--------
1   John    123
2   Mark    123
3   Tom     231
4   Debra   321
5   Debra   321
6   Debra   321
7   Tom     321

如何选择cardId相同但名称不同的记录? 输出应该是这样的

  name  cardId
--------
   John    123
   Mark    123
   Debra   321
   Tom     321

编辑: 只是要清楚。一个用户可以有多个cardId,但是一个cardId不能在不同用户之间共享。我怎样才能找到这个?

4 个答案:

答案 0 :(得分:2)

def iscaptain(guild,user):
    userRoles = user.roles
    roleParam = ""
    for role in userRoles:
        roleParam = roleParam + "," + str(role.id)
    #sqlConn = pyodbc.connect(SQLConnString,timeout=20)
    with pyodbc.connect(SQLConnString,timeout=20) as sqlConn:
        with sqlConn.cursor() as cursor:
            roleParam = roleParam[1:]
            cursor.execute('EXEC corgi.GetUserAccess ?, ?;', guild.id, roleParam)
            return any(row[1] == "Team Captain" for row in cursor)
    return False

我认为测试数据需要 Tom 的另一行,使用 with t as ( select 1 Id , 'John' name, 123 CardId union all select 2 , 'Mark' , 123 union all select 3 , 'Tom' , 231 union all select 4 , 'Debra' , 321 union all select 5 , 'Debra' , 321 union all select 6 , 'Debra' , 321 union all select 7 , 'Tom' , 321 union all select 8 , 'Tom' , 322 ) 解决方案 Tom 322 被返回,但根据规范不应该因为它是单个 CardId

max()/group by

您需要计算不同 CardId 的数量并过滤单行

答案 1 :(得分:1)

使用exists

select distinct t.*
from t
where exists (select 1
              from t t2
              where t2.cardid = t.cardid and t2.name <> t.name
             );

使用 (cardid, name) 上的索引,这可能是处理查询的最快方法。

答案 2 :(得分:0)

我认为一个简单的 group by 就可以了:

SELECT
    name,
    MAX(cardId)
FROM table
GROUP BY name

编辑 由于问题已更新,我认为您正在寻找这样的东西:

SELECT
    MIN(name),
    MAX(name),
    cardId,
    COUNT(name) name_count
FROM table
GROUP BY cardId
HAVING COUNT(name) >= 2

您也可以通过将表与自身连接来实现这一点,但是带有 HAVING 的版本的优点是当您有 3 个或更多人具有相同的 {{1} }.

答案 3 :(得分:0)

使用 GROUP BY 可以解决您的问题

select name, max(cardid) as cardid from table_1
group by name 
order by cardid asc