SQL选择行并排除子项

Jim*_*Jim 5 mysql sql

我有两张桌子A和B. A是B的父母.我试图找到所有没有特定B作为孩子的所有.通常我会这样做

SELECT A.id FROM A 
    WHERE A.id NOT IN 
        (SELECT B.AId FROM B WHERE B.someFK = foo);

但是出于性能原因,我不想使用内部选择.我尝试过类似的东西:

SELECT A.id FROM A 
    LEFT JOIN B ON (A.id = B.AId)
    WHERE B.someFK != foo OR B.someFK IS NULL

问题是这个返回因为它有多个孩子而不管他们是否有指定的B.

编辑:将B.id更改为B.someFK

Fal*_*con 2

我会选择exists 子句,因为它是为了这样的目的而创建的:

SELECT A.id FROM A WHERE NOT EXISTS (SELECT 1 FROM B WHERE B.id = foo and B.AId=a.id);
Run Code Online (Sandbox Code Playgroud)

在大多数数据库中,对于大型记录集,它比in子句(基本上是一个要比较的数组)性能要高得多。

聚合也很昂贵,所以恕我直言,使用exists语句是最好的方法。不过,您可以尝试针对您的场景进行聚合。