2012-10-15 79 views
1

我有10個在SQL Server中創建的臨時表,我期待的就是將它們全部結合到一個最終臨時表中,並將它們全部保存在一張表上。所有的表格只有一行,看起來非常像下面的兩個臨時表。將臨時表聯合到一個最終的臨時表中

這裏是我到目前爲止這只是兩個臨時表因爲他們所有的正是這樣一個的例子則是#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 

如果這個聯合行的形式將這些臨時表形成到最後一個表。那麼這是正確的方式來顯示所有這些聯合的行。當我做這個聯盟時,我得到的消息列數在聯盟中需要匹配在聯盟中選擇的列數

+0

您是否試圖在最後插入1列? – Greg

+0

你確定要使用'UNION'而不是'UNION ALL'嗎? – Kermit

回答

2

我認爲您使用的聯盟方式不正確。如果必須創建具有相同結構並想將其放入一個數據集的數據集,則使用聯合。

例如爲:

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 
+0

是的,兩個臨時表中的列是數據表中所有行的計數,因此臨時表有一列稱爲countsomething,一行爲行數。 – LewSim

+0

所以是的我想要一個數據集包含所有這些列形成其他臨時表。 – LewSim

+0

好的。樞軸可能是這樣做的最好方式,但它也更復雜一些。 @bluefeet給出了一個答案來做一個關鍵。我上面的內容應該會給你你想要的結果。 – Greg

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 
0

如果你想獲得計數在結果TA每個臨時表BLE,你只需要計算它的每一列在子查詢:

INSERT INTO結果(COL1,COL2,...... 選擇 (SELECT COUNT()FROM TBL 1)COL1 ,(SELECT COUNT( )FROM tbl2)col2 ..

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

請爲您的代碼添加一些說明,這將有助於其他人在未來在谷歌搜索後看到您的答案 –

+0

絕對是最簡單和最好的答案。選擇table2,table3和table4的並集到Temp表(#1) – user1491819