0

1つのユーザー関係に対して多くのレコードを持つUserテーブルがあります。UserIdが同じで、UserNameが異なるすべてのレコードを検索したいと思います。

たとえば、私は試しました:

SELECT UserId, UserName, count(*) FROM tblUser
GROUP BY UserId, UserName

これにより、ユーザーのリストと、UserIdとUserNameの明確な組み合わせが何回あるかがわかります。

だから私の希望する出力は

UserId    | UserName
----------+-----------
1111      | Bob
1111      | JoeBob
2222      | Jimmy
2222      | ILikeTurtles
4

3 に答える 3

3
select *
from tblUser t1
inner join (
  SELECT UserId
  FROM tblUser 
  GROUP BY UserId
  having count(distinct UserName) > 1
) t2
  on t1.UserID = t2.UserID
于 2012-07-16T19:22:26.883 に答える
1

私はあなたが言うことを次のように解釈するつもりです:「そしてユーザー名は支配的な名前とは異なります」。

したがって、問題は最も一般的な名前を見つけてから、それ以外のすべての行を見つけることです。

with tgrp as (select tu.userid, tu.username, count(*) as cnt
              from tblUser tu
              group by tu.userid, tu.username
             ),
     tmax as (select tu.userid, tu.username, cnt
              from tgrp join
                   (select tu.userid, max(cnt) as maxcnt
                    from tgrp
                    group by tu.userid
                   ) t1
                   on tgrp.userid = t1.userid and tgrp.cnt = t1.maxcnt
             )
select *
from tblUser tu left outer join
     tmax
     on tu.userid = tmax.userid and tu.username = tmax.username
where tmax.userid is null

このクエリは段階的に実行します。idとnameのすべての組み合わせのカウントを検索します。次に、最大の組み合わせを見つけます。次に、最大の組み合わせではないものをすべて見つけます。

複数の名前を持つユーザーIDが必要な場合は、次を使用できます。

select userid
from tblUser tu
group by userid
having count(distinct username) > 1

完全なレコードを取得するには、これを元のテーブルに結合します。

select *
from tbl_user tu
where tu.userid in (select userid
                    from tblUser tu
                    group by userid
                    having count(distinct username) > 1
                   )
于 2012-07-16T19:23:28.433 に答える
0
select t.userid, t.username
from tbluser t
where exists(select 1 
             from tbluser t2
             where t.userid = t2.userid
               and t.username <> t2.username)
于 2012-07-16T19:44:23.887 に答える