假设您有表A
CREATE TABLE A (
id int,
attribute varchar(10)
)
CREATE TABLE B (
id int,
parent_id int,
attribute varchar(10)
)
parent_id是指向A中id列的链接。如果B.attribute =“Test”,我希望所有行都来自A(所有列)。请注意,每个A可能有多个B记录,但我只想要DISTICT A.我知道我可以做到这一点,但似乎它不会有效。
SELECT DISTINCT a.id, a.attribute
FROM A a JOIN B b ON a.id = b.parent_id
WHERE b.attribute = "Test
答案 0 :(得分:3)
通常EXISTS的运行速度比IN()快,所以我通常更喜欢这个查询而不是其他查询。尝试一下!
SELECT a.id, a.attribute
FROM A a
WHERE EXISTS
( SELECT 1
FROM B b
WHERE a.id = b.parent_id
AND b.attribute = 'Test'
);
答案 1 :(得分:1)
使用IN
的效果会优于您的查询。但是,最好的选择是EXISTS
,因为@John Ruddell在answer
SELECT a.id,
a.attribute
FROM A AS a
WHERE a.id IN (SELECT parent_id
FROM B AS b
WHERE b.attribute = "Test");
EXISTS
更快,因为一旦引擎发现命中,它就会退出,因为条件已证明是正确的。使用IN,它将在进一步处理之前收集子查询中的所有结果。(SO)
SELECT a.id, a.attribute
FROM A a
WHERE EXISTS
( SELECT 1
FROM B b
WHERE a.id = b.parent_id
AND b.attribute = 'Test'
);