Как выбрать общие элементы из нескольких таблиц? - PullRequest
2 голосов
/ 05 мая 2020

У меня есть таблицы с t1 по t37. У каждого есть идентификатор первичного ключа. Но у каждой таблицы разное количество идентификаторов. Я хотел бы сравнить идентификаторы в таблицах и получить те, которые имеют хотя бы одно совпадение в другой таблице. Я уже создал запрос, который дает мне результат для следующего примера. Но есть ли способ сделать это, когда у меня большое количество таблиц?

Пример: Если A (1,2,3,4,5,6), B (1,7,8), C (6,7,8), то я должен получить (1,6,7,8).

Пример запроса

Схема (PostgreSQL v12)

CREATE TABLE test (
  id INT
);
INSERT INTO test (id) VALUES (1);
INSERT INTO test (id) VALUES (2);
INSERT INTO test (id) VALUES (3);
INSERT INTO test (id) VALUES (4);
INSERT INTO test (id) VALUES (5);
INSERT INTO test (id) VALUES (6);

CREATE TABLE test1 (
  id INT
);
INSERT INTO test1 (id) VALUES (1);
INSERT INTO test1 (id) VALUES (7);
INSERT INTO test1 (id) VALUES (8);

CREATE TABLE test2 (
  id INT
);
INSERT INTO test2 (id) VALUES (6);
INSERT INTO test2 (id) VALUES (7);
INSERT INTO test2 (id) VALUES (8);

Запрос №1

select *
from test

intersect

select *
from test1

union

select *
from test

intersect

select *
from test2

union

select *
from test1

intersect

select *
from test2;
| id  |
| --- |
| 6   |
| 7   |
| 1   |
| 8   |

1 Ответ

3 голосов
/ 05 мая 2020

Вы можете union all все идентификаторы вместе, а затем сгруппировать идентификаторы:

SELECT id 
FROM (
  SELECT id FROM test
  UNION ALL
  SELECT id FROM test1
  UNION ALL
  SELECT id FROM test2
) sub
GROUP BY id
HAVING COUNT(id)>1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...