【发布时间】:2021-09-06 07:08:57
【问题描述】:
我会考虑三个简单的表格。 A、B 是我的实体表,C 是在 A 和 B 之间创建多对多关系的中间表。
架构:
A: (id INTEGER PRIMARY KEY)
B: (id INTEGER PRIMARY KEY)
C: (
A_id INTEGER,
B_id INTEGER,
FOREIGN KEY(A_id) REFERENCES A(id),
FOREIGN KEY(B_id) REFERENCES B(id)
)
现在,考虑下面的查询
SELECT
A.id
FROM A
LEFT OUTER JOIN C
ON (A.id = C.A_id)
LEFT OUTER JOIN B
ON (C.B_id = B.id)
WHERE ...;
此查询将导致 A.id 的重复值,这是预期的,因为 C 可能有多行与 A 的每一行关联。我的问题是消除这些重复并获取 A 记录的最佳方法是什么。我只需要 A 记录。
我知道两种方法,
-- Using DISTINCT
SELECT
DISTINCT(A.id), ...
FROM A
LEFT OUTER JOIN C
ON (A.id = C.A_id)
LEFT OUTER JOIN B
ON (C.B_id = B.id)
WHERE ...
ORDER BY A.id;
和
-- Or using A.id IN (above query)/ A.id = Any(above query)
SELECT
...
FROM A
WHERE A.id IN (
SELECT
A.id
FROM A
LEFT OUTER JOIN C
ON (A.id = C.A_id)
LEFT OUTER JOIN B
ON (C.B_id = B.id)
WHERE ...
);
我正在使用 PostgreSQL。我需要包含所有用于过滤的表,因此不能将不加入表视为一种改进。我已经分析了这两个查询,但我仍然觉得可能有更好的方法来做到这一点(就性能而言)。
非常感谢任何帮助!
【问题讨论】:
-
这在很大程度上取决于条件。为什么要使用
left join和where子句? -
因为我需要
WHERE子句中 B & A 的属性
标签: sql postgresql query-optimization