早期(或重新排序)的查询重新使用派生列的 - 这是有效的ANSI SQL?
-
20-09-2019 - |
题
这是有效的ANSI SQL:
SELECT 1 AS X
,2 * X AS Y
,3 * Y AS Z
由于Teradata的(12)可以做到这一点,以及本(是的,疯狂的是不是):
SELECT 3 * Y AS Z
,2 * X AS Y
,1 AS X
但是,SQL Server 2005的要求是这样的:
SELECT X
,Y
,3 * Y AS Z
FROM (
SELECT X
,2 * X AS Y
FROM (
SELECT 1 AS X
) AS X
) AS Y
解决方案
没有,这不是有效的ANSI。 ANSI假定所有SELECT子句项都在一次评价。
和I'd've在2005年SQL编写它:
SELECT *
FROM (SELECT 1 AS X) X
CROSS APPLY (SELECT 2 * X AS Y) Y
CROSS APPLY (SELECT 3 * Y AS Z) Z
;
其他提示
它并不需要在SQL Server的2005+那个丑陋的。这就是为什么微软推出的CTE:
WITH T1 AS (SELECT 1 AS X),
T2 AS (SELECT X, 2 * X AS Y FROM T1)
SELECT X, Y, 3 * Y AS Z FROM T2
或者像罗布能证明你可以使用CROSS APPLY
- 这可能会或可能不是你根据查询的具体的工作
我承认,它并不像Teradata的干净,但它不是几乎一样糟糕子查询的版本,并在你的问题原来Teradata的例子绝对不是SQL-92标准的一部分。
我还想补充一点,在你原来的例子中,X
,Y
和Z
列都没有,在技术上,派生列的,你给他们打电话。至少就微软和ANSI而言,他们只是别名的,直到它实际上变成一列(即通过一个子查询或CTE)的别名不能参考另一个别名。
不隶属于 StackOverflow