为什么SELECT中的列不属于SELECT

时间:2014-09-12 22:41:43

标签: sql

我有这个选择,但不起作用。

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)它的错误?

谢谢

2 个答案:

答案 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;