我有三个表:
athlete , epreuve , rangindividuel
我希望所有从未被排除在测试之外的运动员(取消资格意味着为NULL(。运动员可以参加一项或多项测试。我试过这个:
SELECT a.aid,
COUNT(e.epid)
FROM rangindividuel ri,
athlete a,
epreuve e
WHERE a.aid = ri.aid
AND e.epid = ri.epid
GROUP BY aid
HAVING SUM(ri.rang) IS NOT NULL;
我不知道为什么不起作用
SUM(rang)
将仅为NULL
,如果运动员的所有rang
的值均为NULL
。但是,如果存在NULL值和非NULL值的混合,则会得到非NULL值之和。
将自加入与返回所有被取消资格的运动员的查询一起使用,并将其过滤掉。
SELECT r1.aid, COUNT(*)
FROM rangindividuel AS r1
LEFT JOIN rangindividuel AS r2 ON r1.aid = r2.aid AND r2.rang IS NULL
WHERE r2.aid IS NULL
GROUP BY r1.aid
你可以做:
HAVING SUM(ri.rang IS NULL)=0
如果他们被取消资格,则ri.rang is null
返回true,如果没有被取消资格则返回false。在数字上下文中,true和false分别为1和0。当你对运动员的所有测试进行求和时,只有当所有求和的表达式都是假的,也就是说,只有当他们从未被取消资格时,你才会得到0。
正如在评论中提到的,您使用的是旧的、不推荐使用的、笨拙的、难以阅读的逗号联接语法。您应该在on子句中使用显式联接。所以不是:
FROM rangindividuel ri,
athlete a,
epreuve e
WHERE a.aid = ri.aid
AND e.epid = ri.epid
do:
FROM rangindividuel ri
JOIN athlete a ON a.aid = ri.aid
JOIN epreuve e ON e.epid = ri.epid