我有这样的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]是错误的! 我怎么能这样做?
谢谢你的回答!
答案 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
希望这有帮助。