我有这个选择,但不起作用。
select
a.code1,
a.data1,
a.stval,
(select sum(col1+col2+col3) from tad ) as sum1,
(select sum(col7+col8+col9) from tbac) as sum2,
CASE
WHEN (sum1+sum2) > 100 THEN (a.stval * sum1)
WHEN (sum1+sum2( <= 100 THEN (a.stval * sum2)
END as newdat1
from arti as a
错误在哪里?为什么(sum1 + sum2)它的错误?
谢谢
答案 0 :(得分:2)
(sum1 + sum2)是一个错误,因为这些标识符未在您尝试使用它们的范围内定义。在SQL选择列表中,您无法使用在同一选择列表中声明的符号,无论它们在列表中的位置如何。如果需要访问sum1和sum2,请使用子查询。
答案 1 :(得分:1)
具体原因是SQL是一种描述性语言,不保证表达式的评估顺序。在select
子句中也是如此。在where
子句中也是如此。在from
条款中确实如此。 SQL 描述结果的样子。它不会规定具体行动。
因此,SQL不允许select
中定义的标识符在同一select
子句中使用(也不允许在同一级别的where
子句中使用)。表达式可以按任何顺序处理。
在您的情况下,正常的解决方案是使用子查询或CTE。但是,在您的情况下,子查询独立于外部查询(如所写),因此我将它们移到from
子句:
select a.code1, a.data1, a.stval, x1.sum1, x2.sum2,
(CASE WHEN x1.sum1 + x2.sum2 > 100 THEN a.stval * x1.sum1
WHEN x1.sum1 + x2.sum2 <= 100 THEN a.stval * x2.sum2
END) as newdat1
from arti a cross join
(select sum(col1+col2+col3) as sum1 from tad ) x1 cross join
(select sum(col7+col8+col9) as sum2 from tbac) x2;
编辑:
您可以使用子查询或CTE。但有一种方法建立在上述基础之上:
select a.code1, a.data1, a.stval, x1.sum1, x2.sum2,
(CASE WHEN x1.sum1 + x2.sum2 > 100 THEN a.stval * x1.sum1
WHEN x1.sum1 + x2.sum2 <= 100 THEN a.stval * x2.sum2
END) as newdat1
from arti a join
(select ascon, sum(col1+col2+col3) as sum1
from tad
group by ascon
) x1
on x1.ascon = arti.code1 cross join
(select sum(col7+col8+col9) as sum2 from tbac) x2;