将临时表联合到最终临时表

时间:2012-10-15 23:31:35

标签: sql sql-server union

我喜欢在SQL服务器中创建10个差异临时表,我想要做的就是将它们全部联合到最终的临时表中,将它们全部保存在一个表中。所有表只有一行,看起来与下面的两个临时表非常相似。

这是我到目前为止这只是两个临时表的一个例子,因为它们都完全像这个,然后#final是我希望将all连接到的表:

      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

如果这个联合行的表单形成那些临时表到最后一个。然后这是显示所有那些联合的行的正确方法。当我执行此联合时,我在联合中获取列的消息数需要匹配在联合中选择的列数

4 个答案:

答案 0 :(得分:3)

我认为你以错误的方式使用工会。当您需要具有相同结构且希望将它们放入一个数据集的数据集时,将使用联合。

e.g:

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

答案 1 :(得分: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(),然后使用{{1加入表}}:

row_number()

答案 2 :(得分:2)

SELECT * 
INTO #1
FROM TABLE2
UNION
SELECT *
FROM TABLE3
UNION
SELECT *
FROM TABLE4

答案 3 :(得分:0)

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

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