组合不同(冗长)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,我们只需直接连接表 TU)。我只是简单地演示一下这个方法。

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的主要内容,如果未能解决你的问题,请参考以下文章

如何让多个不同的SQL语句一起执行?

SQL 插入到存在列的位置

mysql 插入列的SQL语句

具有唯一值的列的 SQL 总和量

计算具有多个条件的列的许多不同组合

是否可以将多个 SQL 语句组合在一起?