好的,我觉得这应该很明显,但我没有看到。我有一个标记系统,其中有两个表(比如 A 和 C)通过第三个表(比如 B)相关(多对多)。
我想根据 C 中的字段选择 A 中满足条件的所有唯一行。也就是说,如果 A 中的同一行被 C 中符合我条件的多个标签标记,我不想要多个后排 - 只是 A 中的单行。
因此,我希望 A 中的所有行都具有符合我基于 C 中的字段的条件的标签。但我从不希望 A 中的行重复,即使它有多个符合条件的标签。
好的,我觉得这应该很明显,但我没有看到。我有一个标记系统,其中有两个表(比如 A 和 C)通过第三个表(比如 B)相关(多对多)。
我想根据 C 中的字段选择 A 中满足条件的所有唯一行。也就是说,如果 A 中的同一行被 C 中符合我条件的多个标签标记,我不想要多个后排 - 只是 A 中的单行。
因此,我希望 A 中的所有行都具有符合我基于 C 中的字段的条件的标签。但我从不希望 A 中的行重复,即使它有多个符合条件的标签。
简单的解决方案是添加DISTINCT
关键字。换句话说,改变这个:
SELECT A.foo FROM ...
对此:
SELECT DISTINCT A.foo FROM ...
该DISTINCT
关键字可确保您不会在结果中出现重复项。
另一种解决方案是重写您的查询以使用EXISTS
:
SELECT *
FROM A
WHERE EXISTS
(
SELECT *
FROM B
JOIN C
ON ...
WHERE ...
)
SELECT DISTINCT A.*
FROM A
INNER JOIN B
ON A.id = B.id
INNER JOIN C
ON C.id = B.id
WHERE C.SomeField = 'SomeValue'