2011-08-16 87 views
26

选择行考虑跟随表具有2列相等值

C1 || C2 || C3 || C4 
-------------------------- 
1  || a || b || 1 
2  || a || b || 4 
3  || b || d || 2 
4  || b || d || 2 

问题1:选择列C2,C3,C4具有相同的值例如所有行在上面的例子中选择第3行和第4行。

问题2:选择所有C4列中有重复的行,例如, C4拥有价值2在3行和第4行,所以选择行3和4

回答

41

问题1查询:

SELECT ta.C1 
     ,ta.C2 
     ,ta.C3 
     ,ta.C4 
FROM [TableA] ta 
WHERE (SELECT COUNT(*) 
     FROM [TableA] ta2 
     WHERE ta.C2=ta2.C2 
     AND ta.C3=ta2.C3 
     AND ta.C4=ta2.C4)>1 
+1

您需要删除C1上的谓词,因为它似乎是唯一的ID。 –

+0

好点@ a'r,欢呼 – Curt

+1

谢谢,它完美地工作 – Rohit

-1
select * from test; 
a1 a2 a3 
1 1 2 
1 2 2 
2 1 2 

select t1.a3 from test t1, test t2 where t1.a1 = t2.a1 and t2.a2 = t1.a2 and t1.a1 = t2.a2 

a3 
1 

你可以尝试使用同样的事情加盟太..

+0

@DownVoter:为了简单起见,我使用3列进行了解释,并且我回答了问题1,请解释发生了什么问题? – Kracekumar

+0

我没有投票,但您的查询不起作用。尝试使用提供的示例数据。它将需要只返回第3和第4行。 –

+0

即使我没有投票。谢谢你试一试。首先回答为我工作。 – Rohit

0
select t.* from table t 
    join (
     select C2, C3, C4 
     from table 
     group by C2, C3, C4 
     having count(*) > 1 
    ) t2 
    using (C2, C3, C4); 
6

其实这会走得更快在大多数情况下:

SELECT * 
FROM table ta1 
JOIN table ta2 on ta1.id != ta2.id 
WHERE ta1.c2 = ta2.c2 and ta1.c3 = ta2.c3 and ta1.c4 = ta2.c4 

呦你加入具有相同值的不同行。我认为它应该工作。如我错了请纠正我。

2
Select * from tablename t1, tablename t2, tablename t3 
where t1.C1 = t2.c2 and t2.c2 = t3.c3 

看起来像这样会工作。虽然似乎不是一种有效的方式。

1
SELECT * 
FROM my_table 
WHERE column_a <=> column_b AND column_a <=> column_c 
+0

我可以证实这是有效的。 – aalaap