首页 > 解决方案 > 如何从多个表中选择公共元素?

问题描述

我有表 t1 到 t37。每个都有一个主键 ID。但每张表的 ID 数量并不相同。我想跨表比较 ID,并获取在另一个表中至少有一个匹配项的 ID。我已经创建了一个查询,它为我提供了以下示例的结果。但是当我有大量表时,有没有办法做到这一点?

示例:如果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   |

标签: sqlpostgresql

解决方案


您可以将union all所有 id 放在一起,然后对 id 进行分组:

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;

推荐阅读