SQL выбирает парные комбинации из таблицы, отвечающей заданным критериям - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть таблица PostgreSQL, которая выглядит примерно так:

+------+----------+----------+------------+
|  id  | group_id |   role   | subject_id |
+------+----------+----------+------------+
| A-L1 | A        | leader   |          1 |
| A-F2 | A        | follower |          2 |
| A-F3 | A        | follower |          3 |
| B-L4 | B        | leader   |          4 |
| B-F5 | B        | follower |          5 |
| B-F6 | B        | follower |          6 |
| B-F7 | B        | follower |          7 |
| C-L8 | C        | leader   |          8 |
| C-F9 | C        | follower |          9 |
+------+----------+----------+------------+

Я хочу выбрать парные комбинации из этой таблицы, но только внутри каждой группы и только те парные комбинации, в которых участвует «лидер».роль.Например.результат должен выглядеть следующим образом:

+---------+-----------+-------------+
| pair_id | leader_id | follower_id |
+---------+-----------+-------------+
| A-L1-F2 | A-L1      | A-F2        |
| A-L1-F3 | A-L1      | A-F3        |
| B-L4-F5 | B-L4      | B-F5        |
| B-L4-F6 | B-L4      | B-F6        |
| B-L4-F7 | B-L4      | B-F7        |
| C-L8-F9 | C-L8      | C-F9        |
+---------+-----------+-------------+

Поскольку я буду делать этот запрос много раз, я бы хотел превратить его в представление.Любые предложения по коду SQL я могу использовать для этого?На данный момент я ничего не пробовал, потому что я не уверен, с чего начать, и только начинаю работать с SQL.

1 Ответ

0 голосов
/ 20 сентября 2018

Рассмотрите возможность использования собственных объединений, выровненных по одному и тому же group_id , но с разными ролями, при этом последние две таблицы выровнены по id и одинаковыми ролями:

SELECT t1.id || Replace(t2.id, t2.group_id, '') AS pair_id, 
       t1.id AS leader_id, 
       t3.id AS follower_id
FROM pgTable t1
INNER JOIN pgTable t2 ON t1.group_id = t2.group_id
INNER JOIN pgTable t3 ON t1.group_id = t3.group_id AND t2.id = t3.id
WHERE t1.role = 'leader' AND t2.role = 'follower' AND t3.role = 'follower';

RextesterDemo

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