2015-11-20 18 views
2

我有兩個不同表的條目組合,其中一個具有可變數目的條目和填充列的問題。組合兩個臨時表與可變數目的條目

我的輸入數據:

我有一個包含可變數目個條目的表1 /列(我只知道有多少列有可能是最大的),我有一個定義的項目數的表2和我使用定義的列數創建了我的結果的表格(列數=組合前兩個表格的最大列數)。

我的任務是:

我想利用 - 從表1行中所有條目 - 且僅結合起來 - 四項連續從表2 - 在新表3一行。但同時我不知道table1有多少個填充列。所以我不能在table3的哪一列中定義table1的條目應該被插入。

示例數據:

-- TABLE1 and TABLE2 are my input 
-- Here I defined 8 columns for TABLE1, but it can be more or less 

CREATE TABLE #t1(
    [ID] [int] identity(1,1), 
    [IDBG1] [int] NULL, 
    [BG1] nvarchar(max), 
    [IDBG2] [int] NULL, 
    [BG2] nvarchar(max), 
    [IDBG3] [int] NULL, 
    [BG3] nvarchar(max), 
    [IDBG4] [int] NULL, 
    [BG4] nvarchar(max) 
    ) 

CREATE TABLE #t2(
    [ID] [int] identity(1,1), 
    [IDBG1] [int] NULL, 
    [BG1] nvarchar(max), 
    [IDBG2] [int] NULL, 
    [BG2] nvarchar(max) 
    ) 

-- TABLE3 is for my results 
-- number of columns is max. number of columns of TABLE 1 plus number of columns of TABLE2 
-- here: 8 Columns for TABLE1 entries and 4 columns for TABLE2 entries 

CREATE TABLE #t3(
    [ID] [int] identity(1,1), 
    [IDBG1] [int] NULL, 
    [BG1] nvarchar(max), 
    [IDBG2] [int] NULL, 
    [BG2] nvarchar(max), 
    [IDBG3] [int] NULL, 
    [BG3] nvarchar(max), 
    [IDBG4] [int] NULL, 
    [BG4] nvarchar(max), 
    [IDBG5] [int] NULL, 
    [BG5] nvarchar(max), 
    [IDBG6] [int] NULL, 
    [BG6] nvarchar(max) 
    ) 

-- the IDBG entries are ID's and the BG's are the corresponding names 
-- for example 

INSERT INTO #t1 (IDBG1, BG1, IDBG2, BG2, IDBG3, BG3, IDBG4, BG4) 
VALUES (102, 'BS', 302, 'SL', 345, 'AS', 75, 'LT') 

INSERT INTO #t2 (IDBG1, BG1, IDBG2, BG2) 
VALUES (900, 'SM', 789, 'CS') 

SELECT * FROM #t1 
SELECT * FROM #t2 
SELECT * FROM #t3 

這可能嗎?因爲我只知道,應該填寫的列必須在之前指定!

+0

添加樣本表數據及其預期結果。 – jarlh

+0

聽起來像一個視圖將更合適 – AntDC

+0

我添加了一些示例數據。希望你現在明白更好。 –

回答

0

你想要做的被稱爲CROSS JOIN什麼:

INSERT INTO #t1 (IDBG1, BG1, IDBG2, BG2, IDBG3, BG3, IDBG4, BG4) 
VALUES (102, 'BS', 302, 'SL', 345, 'AS', 75, 'LT') 
    , (103, 'BS', 302, 'SL', 345, 'AS', 75, 'LT') 

INSERT INTO #t2 (IDBG1, BG1, IDBG2, BG2) 
VALUES (900, 'SM', 789, 'CS') 
    , (901, 'SM', 789, 'CS') 

INSERT INTO #t3(IDBG1, BG1, IDBG2, BG2, IDBG3, BG3, IDBG4, BG4, IDBG5, BG5, IDBG6, BG6) 
SELECT t1.IDBG1, t1.BG1, t1.IDBG2, t1.BG2, t1.IDBG3, t1.BG3, t1.IDBG4, t1.BG4 
    , [IDBG5] = t2.IDBG1, [BG5] = t2.BG1, [IDBG6] = t2.IDBG2, [BG6] = t2.BG2 
FROM #t1 t1 CROSS JOIN #t2 t2 

SELECT * FROM #t1 
SELECT * FROM #t2 
SELECT * FROM #t3 

輸出:

ID IDBG1 BG1 IDBG2 BG2 IDBG3 BG3 IDBG4 BG4 IDBG5 BG5 IDBG6 BG6 
1 102  BS 302  SL 345  AS 75  LT 900  SM 789  CS 
2 103  BS 302  SL 345  AS 75  LT 900  SM 789  CS 
3 102  BS 302  SL 345  AS 75  LT 901  SM 789  CS 
4 103  BS 302  SL 345  AS 75  LT 901  SM 789  CS 

參見:

現在,如果你不知道什麼是t1,你需要編寫一些動態SQL。

此查詢獲取:在@col_select

  • T1 colums(除了ID)從在@col_select#T2(除了ID)從#T3
  • 第一N列
  • 第一4列(除了ID)在用N @col_insert =從t1 + 4(用於T2)計數

查詢:

declare @t1_id bigint = OBJECT_ID('tempdb.dbo.#t1'); 
declare @t2_id bigint = OBJECT_ID('tempdb.dbo.#t2'); 
declare @t3_id bigint = OBJECT_ID('tempdb.dbo.#t3'); 
declare @col_select nvarchar(max), @col_insert nvarchar(max), @sql nvarchar(max); 

-- Get #t1 columns 
Set @col_select = STUFF((
     SELECT ', ' + 't1.' + QUOTENAME(name) 
     FROM tempdb.sys.columns 
     WHERE OBJECT_ID = @t1_id AND name not like 'ID' 
     ORDER BY column_id 
     FOR XML PATH(''), TYPE 
    ).value('.', 'NVARCHAR(MAX)') 
,1,1,''); 

-- Add first 4 columns from #t2 
Set @col_select = @col_select + ',' + STUFF((
     SELECT TOP(4) ', ' + 't2.' + QUOTENAME(name) 
     FROM tempdb.sys.columns 
     WHERE OBJECT_ID = @t2_id AND name not like 'ID' 
     ORDER BY column_id 
     FOR XML PATH(''), TYPE 
    ).value('.', 'NVARCHAR(MAX)') 
,1,1,''); 

-- Get first n columns from #t3 (n = t1 count + 4) 
Set @col_insert = STUFF((
     SELECT TOP(SELECT COUNT(*)-1+4 FROM tempdb.sys.columns WHERE OBJECT_ID = @t1_id) ', ' + QUOTENAME(name) 
     FROM tempdb.sys.columns 
     WHERE OBJECT_ID = @t3_id AND name not like 'ID' 
     ORDER BY column_id 
     FOR XML PATH(''), TYPE 
    ).value('.', 'NVARCHAR(MAX)') 
,1,1,''); 

SET @sql = ' 
    INSERT INTO #t3(' + @col_insert + ') 
    SELECT ' + @col_select + ' 
    FROM #t1 t1 CROSS JOIN #t2 t2 
'; 

EXEC sp_executesql @sql; 

與樣品它得到:

  • @col_select = T1 [IDBG1],T1 [BG1],T1 [IDBG2],T1 [BG2],T1 [IDBG3],T1。。。 [BG3],t1。[IDBG4],t1。[BG4],t2。[IDBG1],t2。[BG1],t2。[IDBG2],t2。[BG2]
  • @col_select = t1。[IDBG1] ,t1。[BG1],t1。[IDBG2],t1。[BG2],t1。[IDBG3],t1。[BG3],t1。[IDBG4],t1。[BG4]
  • @col_insert = [IDBG1],[BG1],[IDBG2],[BG2],[IDBG3],[BG3],[IDBG4],[BG4],[IDBG5],[BG5] IDBG6],[BG6]
+0

太好了,謝謝!我會嘗試! –

相關問題