NULL values sql



我有三个表:

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 

最新更新