组合不同(冗长)SQL 语句的列的最简单方法 - MSSQL
Posted
技术标签:
【中文标题】组合不同(冗长)SQL 语句的列的最简单方法 - MSSQL【英文标题】:Easiest way to combine columns of different (lengthy) SQL statements - MSSQL 【发布时间】:2021-08-25 16:51:56 【问题描述】:我有多个查询要组合,所有这些查询都有自己的连接,很难重新编写和绑定在一起。有没有一种简单的方法可以将多个语句的结果组合起来,分块处理?
例子:
查询 1
WITH Table1a AS (...)
WITH Table2a AS (...)
SELECT multiple_arguments FROM multiple_joined_tables
生成如下表
User | ID | DatasetA | Other Data |
---|---|---|---|
Test1 | 1 | dataA1 | other_data1 |
Test2 | 2 | dataA2 | other_data2 |
Test3 | 3 | dataA3 | other_data3 |
Test4 | 4 | dataA4 | other_data4 |
查询 2
WITH Table1a AS (...)
WITH Table2b AS (...)
WITH Table3c AS (...)
SELECT multiple_arguments FROM multiple_joined_tables
生成如下表
User | ID | DatasetB | More Data |
---|---|---|---|
Test1 | 1 | dataB1 | more_data_1 |
Test2 | 2 | dataB2 | more_data_2 |
Test3 | 3 | dataB3 | more_data_3 |
Test4 | 4 | dataB4 | more_data_4 |
Test5 | 5 | dataB5 | more_data_5 |
对于一般数量的N
查询,我如何标记它们以便以后重新使用它们并按照我的意愿绑定它们,以便我可以将列放在一个最终表中?示例
User | ID | DatasetA | DatasetB | Some Other Data | Some More Data |
---|---|---|---|---|---|
Test1 | 1 | dataA1 | dataB1 | other_data1 | more_data_1 |
Test2 | 2 | dataA2 | dataB2 | other_data2 | more_data_2 |
Test3 | 3 | dataA3 | dataB3 | other_data3 | more_data_3 |
Test4 | 4 | dataA4 | dataB4 | other_data4 | more_data_4 |
Test5 | 5 | NULL | dataB5 | NULL | more_data_5 |
我无法将(WITH Table1 和 Query 1)放置在另一个 WITH 中以供稍后使用,并且由于列不同,我还无法将它们与 UNION 绑定,所以我想查看 general 查询请整齐地贴上标签和装订它们。谢谢。
【问题讨论】:
使用生成临时表的视图或存储过程? 你能告诉我怎么做吗?我不熟悉。谢谢 【参考方案1】:CTE 可以指代它之前的其他 CTE。所以你有两种方法可以做你想做的事。要么“嵌套”CTE,要么只引用最终查询中的所有 CTE。
我个人通常会选择选项 2,因为“嵌套”CTE 有时似乎会产生次优的查询计划。但是,如果选项 1 使代码在您的特定情况下更易于维护,请继续尝试,只关注性能。
以下是两种方法的示例。显然,我希望您的 CTE 中的查询要复杂得多(否则就不需要 CTE,我们只需直接连接表 T
和 U
)。我只是简单地演示一下这个方法。
create table T (i int, t char);
create table U (i int, u char);
-- option 1: combine in CTEs
with
MyT as
(
select i, t from T
), -- note the comma here, and no additional "with"
MyTandU as
(
select MyT.i,
MyT.t,
U.u
from MyT -- referring to the previous CTE
join U on U.i = myT.i
)
select i, t, u from MyTandU;
-- option 2: combine final select
with
MyT as (select i, t from T),
MyU as (select i, u from U)
select MyT.i, MyT.t, MyU.u
from MyT
join MyU on MyU.i = MyT.i
【讨论】:
【参考方案2】:听起来你想要一个视图。通过视图,您可以获取查询结果并为其命名 --- 然后您可以像使用表一样重用该名称。
获取您的第一个查询并将其设为视图。您可以在第二个查询中使用它。
【讨论】:
以上是关于组合不同(冗长)SQL 语句的列的最简单方法 - MSSQL的主要内容,如果未能解决你的问题,请参考以下文章