我想修改保留旧列别名的列。但是当我按它分组时,会发生错误。
var regex = /((([12]\d{3})(-(0[1-9]|1[0-2]))*)(-(0[1-9]|[12]\d|3[01]))*)/;
使用新别名可以工作:
CREATE TABLE some_table (
number1 integer,
number2 integer,
name text
)
但是一旦我想保留旧的列名:
SELECT number1-number2 AS new_number FROM some_table GROUP BY new_number
列“ some_table.number2”必须出现在GROUP BY子句中或在聚合函数中使用
我可以通过两种方式解决此问题:
1。将其包装在另一个选择下
SELECT number1-number2 AS number1 FROM some_table group by number1
2。在“ group by”子句中提供列号
SELECT new_number AS number1 FROM (
SELECT number1-number2 AS new_number FROM some_table GROUP BY new_number) AS query
如果没有上面提供的解决方案,是否可以通过某种方式保留旧别名?
答案 0 :(得分:1)
您可以使用cross apply
:
SELECT v.new_number
FROM some_table t CROSS APPLY
(VALUES (t.number1 - t.number2)) v(new_number)
GROUP BY v.new_number;
您也可以这样做:
SELECT v.number1
FROM some_table t CROSS APPLY
(VALUES (t.number1 - t.number2)) v(number1)
GROUP BY v.number1
答案 1 :(得分:1)
您的原始查询是编写此类查询的最佳方法。您应始终使用与列名不同的别名。
您的第二个查询不完整,使用与列名相同的别名将其混淆。 SELECT
子句中定义的别名不能在GROUP BY
子句中使用,因为后者发生在前者之前。所以你拥有的是:
SELECT number1-number2 AS number1 FROM some_table
GROUP BY some_table.number1
在需要时
SELECT number1-number2 AS number1 FROM some_table
GROUP BY some_table.number1, some_table.number2
或没有表限定符:
SELECT number1-number2 AS number1 FROM some_table
GROUP BY number1, number2
(当然,如果不进行任何汇总,这几乎没有任何意义,但是我知道,这只是一个例子:-)
无论如何,为别名重新使用列名仍然不是一个好主意。想象ORDER BY number1
-那是什么意思;列名还是别名? (我很确定别名在这里具有优先级,但是我不知道这是否实际上是由SQL标准定义的。)
答案 2 :(得分:1)
您可以使用结果列号代替名称。
例如:
GROUP BY 2