1

SQL Serverで作成された10個のdiff一時テーブルがあります。私が探しているのは、それらすべてを1つのテーブルに保持する最終的な一時テーブルに結合することです。すべてのテーブルには1つの行しかなく、以下の2つの一時テーブルとほとんど同じように見えます。

これが私がこれまでに持っているものです。これは、すべてがこれとまったく同じである2つの一時テーブルの例です。#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

ユニオンを間違った方法で使用していると思います。ユニオンは、同じ構造のデータセットが必要で、それらを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つのデータセットを取得することだと思います。ユニオンはこれを行いません。

最も簡単な方法(パフォーマンスはそれほど高くありませんが)は、次のようなselectステートメントを実行することです。

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

各一時テーブルから値を取得して、1行のデータに配置する必要があるようです。これは基本的に、次の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は、個々の一時テーブルごとにが含まれます。サブクエリには2つの列があり、1つの列にはcount(*)テーブルのfromが含まれ、もう1つの列はエイリアスの名前です。

  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():で結合します。

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

結果のテーブルの各一時テーブルのカウントを取得する場合は、サブクエリの各列のカウントを計算するだけです。

INSERT INTO result(col1、col2、。。SELECT(SELECT COUNT()FROM tbl1)col1、(SELECT COUNT()FROM tbl2)col2。。

于 2012-10-16T16:44:19.173 に答える