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

Try to use join and sybquery with 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;

or the same subquery in exists clause:

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 Fiddle Demo

Solution for updated problem

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 Fiddle Demo

于 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

Here is a simple working solution:

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 回答