令人困惑的SQL。简短但很奇怪

时间:2013-12-04 21:07:04

标签: sql tsql db2

我正在使用一个针对DB2大型机数据库的报告工具。当我检查它生成的SQL时,它具有以下(非常简化)格式:

SELECT
    AL1.Field1,
    AL1.Field2
FROM
(
--#region 1
    Big SQL goes here
--#endregion end region 1
)  AL1
(
    Field1,
    Field2
)
WHERE
(AL1.Field1<>0)

我不熟悉DB2 SQL,因为我使用的是T-SQL。这部分让我困惑:

AL1
(
    Field1,
    Field2
)

表达上述SQL的“T-SQL”方式基本上如下吗?

SELECT
    AL1.Field1,
    AL1.Field2
FROM
(
--#region 1
    Big SQL goes here
--#endregion end region 1
) AL1

WHERE
(AL1.Field1<>0)

2 个答案:

答案 0 :(得分:3)

这部分语法称为Correlation Clause。它允许您为嵌套选择中的列提供替代名称。当计算大SQL中的列时,这尤其有用,因为它允许您像命名它们一样引用这些列。

tsql中的相应语法是Common Table Expressions。您的查询将变为:

WITH AL1 (Field1, Field2) AS (
--#region 1
    Big SQL goes here
--#endregion end region 1
)
SELECT Field1, Field2
FROM AL1
WHERE AL1.Field1 <> 0

答案 1 :(得分:2)

您需要重新构建查询以查看逻辑:

SELECT
    AL1.Field1,
    AL1.Field2
FROM
(
--#region 1
    Big SQL goes here
--#endregion end region 1
)  AL1 (Field1, Field2)

此查询意味着,创建临时表“AL1”,此表中的数据将来自大SQL,并且您将列名分配给此表(Field1,Field2),因此您可以在{{{{{ 1}}或WHERE

当您的BIG SQL包含一些函数时,这很有用,例如:

SELECT

引用 ??? 外部子查询,你可以在select中为每一列添加select ??? from ( select max(a) + min(b) from othertbl ) temptbl ,或者你可以使用AS并稍后引用temptbl.mysupercol < / p>