1

我在 SQL 服务器中创建了 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

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

4

4 回答 4

3

我认为您以错误的方式使用工会。当您必须拥有相同结构的数据集并且要将它们放入一个数据集中时,使用联合。

例如:

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
于 2012-10-16T00:01:15.547 回答
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
于 2012-10-16T00:01:29.797 回答
1
SELECT * 
INTO #1
FROM TABLE2
UNION
SELECT *
FROM TABLE3
UNION
SELECT *
FROM TABLE4
于 2015-03-04T22:38:04.750 回答
0

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

插入结果 (col1, col2,... SELECT (SELECT COUNT( ) FROM tbl1) col1 ,(SELECT COUNT( ) FROM tbl2) col2 ..

于 2012-10-16T16:44:19.173 回答