基于下表
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不能在不同用户之间共享。我怎样才能找到这个?
答案 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