获取多行相等的人(Oracle SQL)

时间:2012-03-10 13:08:05

标签: sql database oracle

我有这样的sql架构:

ID    | Like
______|_______ 
p1    |   2
p1    |   3
p1    |   4
p2    |   3
p2    |   2
p3    |   2
p3    |   3
p3    |   4
p4    |   3
p4    |   2

所以我必须选择那些喜欢同样事物的人。 (在此示例中:[p1,p3]和[p2,p4])。所有'喜欢'应该是相同的,所以[p1,p2]是错误的! 我怎么能这样做?

谢谢你的回答!

2 个答案:

答案 0 :(得分:1)

这是关系分工操作。您可以使用NOT EXISTS子句的组合来执行此操作,例如:

SELECT a.ID AS ID1
      ,b.ID AS ID2
FROM   (SELECT DISTINCT ID FROM mytable) a
      ,(SELECT DISTINCT ID FROM mytable) b
WHERE  a.ID < b.ID
AND    NOT EXISTS
       ( SELECT a2.Like
         FROM   mytable a2
         WHERE  a.ID = a2.ID
         MINUS
         SELECT b2.Like
         FROM   mytable b2
         WHERE  b.ID = b2.ID
       )
AND    NOT EXISTS
       ( SELECT b2.Like
         FROM   mytable b2
         WHERE  b.ID = b2.ID
         MINUS
         SELECT a2.Like
         FROM   mytable a2
         WHERE  a.ID = a2.ID
       );

ID1 ID2
=== ===
p1  p3
p2  p4

答案 1 :(得分:0)

您没有指定您正在使用的Oracle版本号。在11g中,您可以使用LISTAGG分析功能。如果您使用的是Oracle 10,则可以使用未记录的WM_CONCAT函数(请注意,在某些版本中,它返回VARCHAR,在其他版本中返回CLOB):

SELECT like, WM_CONCAT(id)
  FROM mytable
 GROUP BY like

以下是有关如何执行此操作的更多信息: http://www.oracle-base.com/articles/misc/StringAggregationTechniques.php

希望这有帮助。