2013-07-18 33 views
10

我有表SQL兩個不相關的表合併成一個

table1的

col1 col2  
a  b 
c  d 

和表2

mycol1 mycol2 
e   f 
g   h 
i   j 
k   l 

我想這兩個表,其中有沒有共同的領域進入一個結合表看起來像:

表3

col1 col2 mycol1 mycol2 
a   b e f 
c   d g h 
null null i j 
null null k l 

即,它就像是把兩個並排放在一起。

我被卡住了!請幫忙!

+1

其中RDBMS?你顯然不想跨加入,但你希望如何排列行。即爲什麼e,f與a,b一起? – Randy

+3

通常,當問題是這樣的時候,你正在做一些實際上沒有意義的事情。你有什麼用於並排表?如果您只是在應用程序中顯示數據,那麼可能比您提出的建議好得多。 – catfood

+0

sqlserver。嗨,e,f不需要跟a,b。表3中的列對彼此獨立。 – user4109

回答

12

獲取每個表中各行的行號,然後做用這些行號全聯接:

WITH CTE1 AS 
(
    SELECT ROW_NUMBER() OVER(ORDER BY col1) AS ROWNUM, * FROM Table1 
), 
CTE2 AS 
(
    SELECT ROW_NUMBER() OVER (ORDER BY mycol1) AS ROWNUM, * FROM Table2 
) 
SELECT col1, col2, mycol1, mycol2 
FROM CTE1 FULL JOIN CTE2 ON CTE1.ROWNUM = CTE2.ROWNUM 

這是假設的SQL Server> = 2005

+0

好 - 除了這是特定於RDBM的 - 其他人可能會使用ROWNUM – Randy

+0

@Randy:謝謝;我添加了RDBMS警告。 – zimdanen

+0

這個效果很好,不管哪個表更長,謝謝。問題已解決 – user4109

1

這真是好,如果你把這個問題爲什麼需要解決的描述。我猜這只是練習sql語法?

無論如何,由於行沒有任何連接它們,我們必須創建一個連接。我選擇了它們的值的排序。此外,由於他們沒有任何連接,所以也會提出一個問題,即爲什麼你想先把它們放在一起。

下面是完整的解決方案:http://sqlfiddle.com/#!6/67e4c/1

的選擇代碼如下所示:

WITH rankedt1 AS 
(
    SELECT col1 
    ,col2 
    ,row_number() OVER (order by col1,col2) AS rn1 
    FROM table1 
) 
,rankedt2 AS 
(
    SELECT mycol1 
    ,mycol2 
    ,row_number() OVER (order by mycol1,mycol2) AS rn2 
    FROM table2 
) 

SELECT 
col1,col2,mycol1,mycol2 
FROM rankedt1 
FULL OUTER JOIN rankedt2 
    ON rn1=rn2 
+1

非常感謝這一點,並@zimdanen答案,和sqlfiddle解決方案。 Blimey,你很快!我已經遇到了這個需求幾次..它不是練習sql語法!該表的最終目的地是由第三方配置Sharepoint Web部件使用的。 – user4109

+0

這很好,不管哪個表更長,謝謝。已解決問題 – user4109

+0

我在需要從通過繼承與另一個表對應的表中提取標識索引值時使用了它。沒有其他特定的數據將這兩者鏈接起來,因爲層次結構中的最高表由許多與各自中的特定數據無關的表繼承。 – blindguy

2

選項1:單查詢

加入兩個表,如果你希望table1中的每一行只與table2中的一行相匹配,那麼你的就有來限制連接。我怎麼樣。計算每個表中的行數並加入該列。行號是數據庫特定的;這裏是一個mysql的解決方案:

SELECT 
    t1.col1, t1.col2, t2.mycol1, t2.mycol2 
FROM 
    (SELECT col1, col2, @t1_row := t1_row + 1 AS rownum FROM table1, (SELECT @t1_row := 0) AS r1) AS t1 
    LEFT JOIN 
    (SELECT mycol1, mycol2, @t2_row := t2_row + 1 AS rownum FROM table2, (SELECT @t2_row := 0) AS r2) AS t2 
    ON t1.rownum = t2.rownum; 

這假設table1比table2更長;如果table2較長,則使用RIGHT JOIN或切換t1和t2子選擇的順序。另請注意,您可以使用子選擇中的ORDER BY子句分別指定每個表的順序。

(見select increment counter in mysql

選項2:後處理

考慮做兩個選擇,然後連接用你最喜歡的腳本語言的結果。這是一個更合理的方法。

+1

我回頭看你的答案!實際上,我不知道table1是否比表2長。最初的問題是這個問題的一個非常簡單的例子。實際上,將會有十幾個表被合併成一個視圖(即不是表,但這不重要)。預先不知道每個十幾個表的大小。第三方得到的觀點,所以選項2是不可行的。 – user4109

+0

@ user4109順便說一句,如果你不知道哪個更長,你可以在'UNION'中通過左連接和右連接在mysql中執行'完全外連接'。 – jmilloy