Получите людей, где несколько строк равны (Oracle SQL) - PullRequest
2 голосов
/ 10 марта 2012

У меня есть схема 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 ]

1 голос
/ 10 марта 2012

Это операция реляционного деления.Вы можете сделать это с помощью комбинации предложений 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
0 голосов
/ 10 марта 2012

Вы не указываете номер версии Oracle, который используете.В 11g вы можете использовать аналитическую функцию LISTAGG для этого.Если вы используете Oracle 10, вы можете использовать недокументированную функцию WM_CONCAT (обратите внимание, что в некоторых версиях она возвращает VARCHAR, а в других версиях - CLOB):

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

Вот еще несколько сведений оможет сделать это: http://www.oracle -base.com / article / misc / StringAggregationTechniques.php

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...