我有一个简单的INSERT
查询,其中还包含其中一个列值的以下代码。
VALUES( ..... ,
CASE WHEN hand < (SELECT AVG(ss.hand) AS r FROM sales ss WHERE ss.year=:year)
THEN (r - hand)
ELSE 0
END)";
这里的目标是在THEN
内使用子查询结果平均值(别名为'r')。问题是,我收到一条错误,说运行查询时找不到列r。如果我从那个中移除'r',它运行正常。我不想将子查询复制到THEN
,因为这会损害性能。
我也尝试对整个子查询进行别名,但这会导致语法错误。
有关此的任何提示吗?我是SQL的新手,现在已经花了好几个小时了。
答案 0 :(得分:2)
你将不得不重复这个表达:
(CASE WHEN hand < (SELECT AVG(ss.hand) FROM sales ss WHERE ss.year=:year)
THEN ((SELECT AVG(ss.hand) FROM sales ss WHERE ss.year=:year) - hand)
ELSE 0
END)
您也可以将其表达为:
greatest(0, (SELECT AVG(ss.hand) FROM sales ss WHERE ss.year=:year) - hand) )
另一种方法是使用select . . . insert
并在from
子句中定义此表达式。