我有两张桌子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
我会选择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语句是最好的方法。不过,您可以尝试针对您的场景进行聚合。