用于动态查找 table、DB2 或 SQL 服务器的紧凑 CTE 语法
Compact CTE syntax for on the fly lookup table, DB2 or SQL Server
我正在创建动态 SQL 查询并在 CTE 中动态构建一些查找表。我想出的语法非常冗长,我想知道是否有更紧凑的方式来表达它。查找表是在代码中创建的 CTE,并且可能因查询而异。希望这个例子能说明问题:
WITH lookuptable1 (code, desc)
AS
(
SELECT 18, 'Oakland' from Sysibm.sysdummy1 union
select 19, 'New York City' from Sysibm.sysdummy1 union
select 20, 'San Francisco' from Sysibm.sysdummy1
)
, lookuptable2 (code2, desc2) as
(
SELECT 18, 'CA' from Sysibm.sysdummy1 union
select 19, 'NY' from Sysibm.sysdummy1 union
select 20, 'AZ' from Sysibm.sysdummy1 union
select 22, 'RI' from Sysibm.sysdummy1
)
select user.userid, code, desc, code2, desc2
from USER
inner join lookuptable1 on user.city = lookuptable1.code
left outer join lookuptable2 on user.state = code2
对于SQL服务器,而不是
SELECT 18, 'Oakland' FROM Sysibm.sysdummy1 UNION
SELECT 19, 'New York City' FROM Sysibm.sysdummy1 UNION
SELECT 20, 'San Francisco' FROM Sysibm.sysdummy1
您可以使用 VALUES
子句
SELECT id, Label
FROM (
VALUES
(18, 'Oakland'),
(19, 'New York City'),
(20, 'San Francisco')
) as X (id, Label)
这里看起来并没有更紧凑,但会提供更多价值。
如果使用 UNION
,您可以将其进一步改进为
SELECT 18, 'Oakland' UNION ALL
SELECT 19, 'New York City' UNION ALL
SELECT 20, 'San Francisco'
因此,如果您不使用 table,则无需 select。当合并时,您会使用 union all
而不是 union
,因为您事先知道您需要所有行,而 union
包括一个重复数据删除阶段,这通常会导致性能问题。
Dale K 的回答对我有用,values 子句在两个数据库中都有效。我在这里只回答 post 完整的查询(正确答案只显示部分语法,对于其他人我想 post 完整的查询)
WITH lookuptable1 (id, label) as
(select id, label
from (
values
(0, 'Oakland'),
(218, 'New York City'),
(121, 'San Francisco')
) as X (id, Label))
,
lookuptable2 (id, label) as
(select id, label
from (
values
( 0, 'CA' ),
( 97, 'NY' ),
( 316, 'AZ' ),
( 296, 'RI' )
) as Y (id,label))
select hji_id, name, lookuptable1.id, lookuptable1.label, lookuptable2.id, lookuptable2.label
from tt_hji
inner join lookuptable1 on ry_id = lookuptable1.id
left outer join lookuptable2 on zone_id = lookuptable2.id
我正在创建动态 SQL 查询并在 CTE 中动态构建一些查找表。我想出的语法非常冗长,我想知道是否有更紧凑的方式来表达它。查找表是在代码中创建的 CTE,并且可能因查询而异。希望这个例子能说明问题:
WITH lookuptable1 (code, desc)
AS
(
SELECT 18, 'Oakland' from Sysibm.sysdummy1 union
select 19, 'New York City' from Sysibm.sysdummy1 union
select 20, 'San Francisco' from Sysibm.sysdummy1
)
, lookuptable2 (code2, desc2) as
(
SELECT 18, 'CA' from Sysibm.sysdummy1 union
select 19, 'NY' from Sysibm.sysdummy1 union
select 20, 'AZ' from Sysibm.sysdummy1 union
select 22, 'RI' from Sysibm.sysdummy1
)
select user.userid, code, desc, code2, desc2
from USER
inner join lookuptable1 on user.city = lookuptable1.code
left outer join lookuptable2 on user.state = code2
对于SQL服务器,而不是
SELECT 18, 'Oakland' FROM Sysibm.sysdummy1 UNION
SELECT 19, 'New York City' FROM Sysibm.sysdummy1 UNION
SELECT 20, 'San Francisco' FROM Sysibm.sysdummy1
您可以使用 VALUES
子句
SELECT id, Label
FROM (
VALUES
(18, 'Oakland'),
(19, 'New York City'),
(20, 'San Francisco')
) as X (id, Label)
这里看起来并没有更紧凑,但会提供更多价值。
如果使用 UNION
,您可以将其进一步改进为
SELECT 18, 'Oakland' UNION ALL
SELECT 19, 'New York City' UNION ALL
SELECT 20, 'San Francisco'
因此,如果您不使用 table,则无需 select。当合并时,您会使用 union all
而不是 union
,因为您事先知道您需要所有行,而 union
包括一个重复数据删除阶段,这通常会导致性能问题。
Dale K 的回答对我有用,values 子句在两个数据库中都有效。我在这里只回答 post 完整的查询(正确答案只显示部分语法,对于其他人我想 post 完整的查询)
WITH lookuptable1 (id, label) as
(select id, label
from (
values
(0, 'Oakland'),
(218, 'New York City'),
(121, 'San Francisco')
) as X (id, Label))
,
lookuptable2 (id, label) as
(select id, label
from (
values
( 0, 'CA' ),
( 97, 'NY' ),
( 316, 'AZ' ),
( 296, 'RI' )
) as Y (id,label))
select hji_id, name, lookuptable1.id, lookuptable1.label, lookuptable2.id, lookuptable2.label
from tt_hji
inner join lookuptable1 on ry_id = lookuptable1.id
left outer join lookuptable2 on zone_id = lookuptable2.id