选择子行中的列具有特定值的行?

时间:2014-09-09 04:30:43

标签: mysql sql

假设您有表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

2 个答案:

答案 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'
);

DEMO

答案 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'
);