2014-11-14 41 views
0

我試圖做到:TSQL合併2數據集就連旁邊的行數海誓山盟

Dataset 1 
    Name1 
    Name2 
    Name3 

    Dataset 2 
    Number1 
    Number2 
    Number3 

將成爲2列:

dataset1 dataset2 
Name1  Number1 
Name2  Number2 
Name3  Number3 

我的數據集1 & 2總會有平等行。 只要兩個名字沒有鏈接到相同的數字,哪個名字鏈接到哪個數字我不在乎,反之亦然。

如何使用SQL/SQL Server解決此問題?

+0

或者您使用的這些數據集或不同服務 –

+0

就在兩個不同的查詢不同的查詢。從NameTable中選擇名稱,從NumberTable中選擇數字,例如 。 – OverflowStack

+0

出於好奇,你需要這種表連接的原因是什麼?你的表包含什麼樣的數據,因爲記錄如何鏈接並不重要? – Dan

回答

2

的基礎如果你不想標識列添加到表,你可以使用像ROW_NUMBER()函數這樣的:

SELECT 
    T1.Col1, 
    T2.Col1 
FROM 
    (SELECT Col1, ROW_NUMBER() OVER (ORDER BY Col1) AS N FROM Table1) T1 
INNER JOIN 
    (SELECT Col1, ROW_NUMBER() OVER (ORDER BY Col1) AS N FROM Table2) T2 
ON T1.N = T2.N 

這裏,你的表的名稱替換Table 1和表2,並與你想從兩個表的輸出列(或列)的名稱替換Col1中。

1

添加標識列到兩個表並執行加入這些列

ALTER TABLE Table1 
    ADD ID INT IDENTITY(1,1) NOT NULL 


ALTER TABLE Table2 
    ADD ID INT IDENTITY(1,1) NOT NULL 


SELECT Table1.dataset1col , Table2.dataset2Col 
From Table1 INNER JOIN Table2 
    ON Table1.ID = Table2.ID 
+0

感謝您的回覆。但是我不能改變數據集。所以它必須在查詢時完成。我也可以使用rank函數並加入。更實用,更優雅的解決方案? – OverflowStack

1

這可能會爲你工作:

;WITH cte1 (name, rn) 
    AS (SELECT Name, 
       row_number() 
        OVER(
        ORDER BY Name) rn 
     FROM Dataset1), 
    cte2 (Number, rn) 
    AS (SELECT Number, 
       row_number() 
        OVER(
        ORDER BY Number) rn 
     FROM Dataset2) 
SELECT name, 
     Number 
FROM cte1 
     JOIN cte2 
     ON cte1.rn = cte2.rn 
0

編寫查詢的另一種方法是:

select row_number() over (order by Names asc) as rownum, 
     Names 
into #Temp1 
from NameTable 

select row_number() over (order by Numbers asc) as rownum, 
     Numbers 
into #Temp2 
from NumberTable 

select Names, Numbers 
from #Temp1 
inner join #Temp2 on #Temp1.rownum = #Temp2.rownum 

Demo

1
WITH Table1 AS 
(
    SELECT ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Dataset1) as Rnk,Dataset1 
    FROM TA1 
) 

With Table2 AS 
(
    SELECT ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Dataset2) as Rnk, Dataset2 
    FROM TA2 
) 

Select Table.Dataset1 as 'DataSet1', Table2.DataSet2 as 'DataSet2' 
From Table1 
inner join Table2 on Table1.Rnk = Table2.Rnk 

因爲你沒有添加的表名所以我認爲它是TA1和TA2。

0

有3種可能的解決方案。

第一:使用下面的技巧(警告:在小數據集的情況下使用此)

SELECT DISTINCT tbl1.col1, tbl2.col2 
FROM 
    (SELECT FirstName AS col1, ROW_NUMBER() OVER (ORDER BY FirstName) Number FROM dbo.User) tbl1 
INNER JOIN 
    (SELECT LastName AS col2, ROW_NUMBER() OVER (ORDER BY LastName) Number FROM dbo.User) tbl2 
ON tbl1.Number = tbl2.Number 

二:使用變量表來存儲導致暫時的。該解決方案適用於較大的數據集。 (約記錄100S)

三: 使用identitfy字段已經mmhasannn提到的兩個表所示。但我會更喜歡這種方法,因爲我們需要修改我們的數據庫結構。

推薦:使用變量表接近

+0

這產生了兩張表的笛卡爾乘積。 –

+0

是的,你是對的。更正了添加RowNumber以供加入的答案 –