【问题标题】:Union temporary tables to a final temporary table将临时表联合到最终临时表
【发布时间】:2012-10-15 23:31:35
【问题描述】:

我在 SQL Server 中创建了 10 个不同的临时表,我想做的是将它们全部合并到一个最终临时表中,将它们全部保存在一张表上。所有的表只有一行,看起来非常像下面的两个临时表。

到目前为止,这是我所拥有的,这是两个临时表的示例,因为它们都与这个完全相同,然后 #final 是我想要将所有表合并到的表:

      create table #lo
      (
         mnbr bigint
      )
      insert into #login (mnbr)
      select distinct (_ID)
      FROM [KDB].[am_LOGS].[dbo].[_LOG] 
      WHERE time >= '2012-7-26 9:00:00

       Select count(*) as countreject
       from #lo

     create table #pffblo
     (
       mber_br
     )
     insert into #pffblo (mber_br)
     select distinct (mber_br)
     from individ ip with (nolock)
     join memb mp with (nolock)
          on( ip.i_id=mp.i_id and mp.p_type=101) 
      where ip.times >= '2012-9-26 11:00:00.000'

     select count(*) as countaccept

    create table #final
    (
        countreject bigint
        , Countacceptbigint
        .....
    )

    insert into #final (Countreject, Countaccept....more rows here...)
    select Countreject, Countaccept, ...more rows selected from temp tables.
    from #final
    union 
    (select * from #lo)
    union
    (select * from #pffblo)
    select *
    from #final

drop table #lo
drop table #pffblo
drop table #final

如果这是将这些临时表中的行合并到最后一个的形式。那么这是显示所有那些因此合并的行的正确方法。当我做这个联合时,我得到联合中的列数需要匹配联合中选择的列数

【问题讨论】:

  • 您是否要在 final 中插入 1 列?
  • 您确定要使用UNION 而不是UNION ALL

标签: sql sql-server union


【解决方案1】:

我认为您以错误的方式使用联合。当您必须处理相同结构的数据集并希望将它们放入一个数据集中时,可以使用联合。

例如:

CREATE TABLE #Table1
(
  col1 BIGINT
)

CREATE TABLE #Table2
(
  col1 BIGINT
)

--populate the temporary tables

CREATE TABLE #Final
(
  col1 BIGINT
)

INSERT INTO #Final (col1)
SELECT *
FROM #Table1
UNION
SELECT *
FROM #Table2

drop table #table1
drop table #table2
drop table #Final

我认为您要做的是获取 1 个数据集,其中包含所有表的计数。工会不会这样做。

最简单的方法(虽然不是很高效)是执行如下选择语句:

CREATE TABLE #Table1
(
  col1 BIGINT
)

CREATE TABLE #Table2
(
  col1 BIGINT
)

--populate the temporary tables

CREATE TABLE #Final
(
  col1 BIGINT,
  col2 BIGINT
)




INSERT INTO #Final (col1, col2)
select (SELECT Count(*) FROM #Table1) as a, (SELECT Count(*) FROM #Table2) as b

select * From #Final

drop table #table1
drop table #table2
drop table #Final

【讨论】:

  • 是的,两个临时表中的列是数据表中所有行的计数,因此临时表有一个称为 countsomething 的列,其中一行是行数。
  • 所以是的,我想要一个包含其他临时表中所有这些列的数据集。
  • 好的。 Pivot 可能是最好的方法,但它也有点复杂。 @bluefeet 已经给出了做一个支点的答案。我上面的内容应该会给你你正在寻找的结果。
  • 执行上述方法在#final table 中没有给我任何东西,但它显示的列只是不应该是我尝试从#countaccept 中选择count(*) 作为countaccept 的值,但仍然没有不工作。尝试枢轴方法给我选择语句的错误编号必须与联合语句中的编号匹配
  • 我用一个更好的例子来更新我的答案,说明如何使用选择。如果您仍然有问题,您可能需要发布您拥有的代码
【解决方案2】:

您似乎想从每个临时表中获取值,然后将其放入单行数据中。这基本上是一个PIVOT,你可以这样使用:

create table #final
(
   countreject bigint
   , Countaccept bigint
        .....
)

insert into #final (Countreject, Countaccept....more rows here...)
select
from
(
  select count(*) value, 'Countreject' col  -- your UNION ALL's here
  from #lo
  union all
  select count(*) value, 'countaccept' col
  from #pffblo
) x
pivot
(
  max(value)
  for col in ([Countreject], [countaccept])
) p

解释:

您将创建一个与此类似的子查询,其中将包含每个临时表的COUNT。子查询中有两列,一列包含表中的count(*),另一列是别名的名称:

  select count(*) value, 'Countreject' col  
  from #lo
  union all
  select count(*) value, 'countaccept' col
  from #pffblo

然后您将PIVOT 这些值插入到您的最终临时表中。

如果您不想使用PIVOT,则可以使用带有聚合函数的CASE 语句:

insert into #final (Countreject, Countaccept....more rows here...)
select max(case when col = 'Countreject' then value end) Countreject,
   max(case when col = 'countaccept' then value end) countaccept
from
(
  select count(*) value, 'Countreject' col  -- your UNION ALL's here
  from #lo
  union all
  select count(*) value, 'countaccept' col
  from #pffblo
) x

或者您可以JOIN 与此类似的所有临时表,在其中为表中的一条记录创建row_number(),然后使用row_number() 加入表:

insert into #final (Countreject, Countaccept....more rows here...)
select isnull(lo.Countreject, 0) Countreject, 
       isnull(pffblo.Countaccept, 0) Countaccept
from
(
  select count(*) Countreject, 
    row_number() over(order by (SELECT 0)) rn
  from #lo
) lo
left join
(
  select count(*) Countaccept, 
    row_number() over(order by (SELECT 0)) rn
  from #pffblo
) pffblo
  on lo.rn = pffblo.rn

【讨论】:

    【解决方案3】:
    SELECT * 
    INTO #1
    FROM TABLE2
    UNION
    SELECT *
    FROM TABLE3
    UNION
    SELECT *
    FROM TABLE4
    

    【讨论】:

    • 请为您的代码添加一些解释,这将有助于将来在 Google 搜索后看到您的答案的其他人
    • 绝对是最简单和最好的答案。选择table2、table3和table4的并集到一个临时表(#1)
    【解决方案4】:

    如果您想获取结果表中每个临时表的计数,您只需为子查询中的每一列计算它:

    INSERT INTO 结果 (col1, col2,... 选择 (从 tbl1 中选择计数())col1 ,(SELECT COUNT() FROM tbl2) col2 ..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多