3

同じ名前で値が異なるすべての行を取得するにはどうすればよいですか?たとえば、次のテーブルがあります。

Name|Value|Description
Rob |Val1 |Text1
Alex|Val1 |Text2
Alan|Val2 |Text3
Alex|Val2 |Text4
Alex|Val2 |Text5  
Alan|Val2 |Text6

クエリで、複数回出現するが値が異なる人物のみを返すようにします。したがって、結果は次のようになります。

Alex|Val1 |Text2 
Alex|Val2 |Text4 
Alex|Val2 |Text5

編集:初期テーブルに別の行を追加しました。一部のクエリでは、結果の一部としてAlanも返されます。明らかに同じ価値があるので、私はそれを望んでいません。これはどのように達成できますか?

4

4 に答える 4

4

joinsybquery一緒に使用してみてくださいhaving

  select p.Name,p.Value,p.Description
    from persons P
    join ( select Name,Value
           from persons
            group by Name,Value
            having count(1)>1
          ) c on p.Name = c.Name
              and p.Value = c.Value
    order by p.Name;

または同じsubquery条項exists

select p.Name,p.Value,p.Description
from persons P
where exists
     ( select Name,Value
       from persons c
        where p.Name = c.Name
        group by Name,Value
        having count(1)>1
      ) 
order by p.Name          

SQLフィドルデモ

更新された問題の解決策

select * 
from Persons c
where name in 
(
select  Name   from(
       select Name,Value 
       from persons        
        group by Name,Value) T

group by Name
  having count(1)>1
)  

SQLフィドルデモ

于 2012-10-25T11:22:02.273 に答える
3

楽しみのために...クロス結合は次のように機能する可能性があります(私はそれをテストしていません):

select distinct 
    p1.*
from 

    Persons p1 
cross join 
    Persons p2 
where 
        p1.Name = p2.Name 
    and p1.Value <> p2.value
    and p1.Description <> p2.Description 

これで、これがどれほど効率的かについての議論を始めることができます...(しかし、私はその一部にはなりません...)

于 2012-10-25T12:50:17.193 に答える
2

簡単な解決策は次のとおりです。

SELECT t.Name, t.Value, t.Description
FROM t_table AS t
JOIN (
    SELECT Name
    FROM (
       SELECT Name FROM  t_table GROUP BY Name,Value
    ) AS sub1
    GROUP BY Name
    HAVING COUNT(*)>1
) AS sub2 ON (t.Name=sub2.Name)
ORDER BY t.Name, t.Value
于 2012-10-25T11:49:31.410 に答える
0

あなたは次のようなことをすることができます

SELECT * FROM TABLE1 AS A WHERE 1 = CASE WHEN(SELECT COUNT(*)FROM TABLE1 AS B WHERE B.NAME = A.NAME)> 1 THEN 1 ELSE 0 END

于 2012-10-25T12:49:42.843 に答える