我有两个表。 一个如下所示
表a
ID, count 1, 123 2, 123 3, 123
表b
ID, count
表b为空
使用时
SELECT CASE WHEN isnotnull(max(b.count)) THEN max(a.count) + max(b.count) ELSE max(a.count) FROM a, b
唯一的结果总是NULL 我很困扰。为什么?
答案 0 :(得分:1)
由于表b
为空,因此max(b.count)
将返回NULL
。使用NULL进行的任何操作都将产生NULL
。
因此,max(a.count) + max(b.count)
为NULL。(this is 123 + NULL which will be NULL always)
。因此,您的查询返回的是NULL。
只要出现NULL,只要使用coalesce
来分配默认值即可。
答案 1 :(得分:1)
使用coalesce()
函数和显式联接,避免用逗号分隔的表名类型为旧联接方法
select coalesce(max(a.count)+max(b.count),max(a.count))
from a left join b on a.id=b.id
答案 2 :(得分:1)
您不需要使用JOIN
,两个子查询中的简单SUM
即可为您提供所需的结果。由于您只在非MAX(b.count)
时添加NULL
,因此我们可以一直将其添加,但在COALESCE
时将NULL
添加为0。
SELECT COALESCE((SELECT MAX(count) FROM b), 0) + (SELECT MAX(count) FROM a)
完成此工作的另一种方法是从每个表中UNION
个count
值:
SELECT COALESCE(MAX(bcount), 0) + MAX(acount)
FROM (SELECT count AS acount, NULL AS bcount FROM a
UNION
SELECT NULL AS acount, count AS bcount FROM b) u
请注意,如果您使用JOIN
,则必须。如果使用FULL JOIN
,则可能会看不到表b中的所有值。例如,考虑表b具有一个条目:LEFT JOIN
的情况。 ID=4, count=456
上的LEFT JOIN
不会在结果表中包含此值(因为表a的ID值分别为1,2和3),所以您将得到错误的结果:
ID
输出
CREATE TABLE a (ID INT, count INT);
INSERT INTO a VALUES (1, 123), (2, 123), (3, 123);
CREATE TABLE b (ID INT, count INT);
INSERT INTO b VALUES (4, 456);
SELECT COALESCE(MAX(b.count), 0) + MAX(a.count)
FROM a
LEFT JOIN b ON a.ID = b.ID
要使用123 (should be 579)
,请写
FULL JOIN
答案 3 :(得分:0)
使用左联接
SELECT coalesce(max(a.count) + max(b.count),max(a.count))
FROM a left join b a.id=b.id