2010-10-14 130 views
0

我得爲您解答,我正在嘗試合併兩個表格,我找不到正確的查詢。SQLServer加入兩個表格

我有兩個表: T1:1column,擁有X記錄 T2:1column,擁有ÿ記錄 注:Y永遠不可能大於X,但它往往比較小的這一個

我要加入這些表爲了有一個兩列的表 t3:ColumnFromT1,columnFromT2。

當Y小於X時,T2字段值重複並遍佈我所有其他值,但是我希望在使用來自T2的所有列時獲得NULL。

我怎麼能做到這一點? 謝謝

回答

2

你可以給每個表中的行數的子查詢。然後你可以在該行號上加入。要從第二個表中回收行,請取第一個表的行號的模數%

例子:

select Sub1.col1 
,  Sub2.col1 
from (
     select row_number() over (order by col1) as rn 
     ,  * 
     from @T1 
     ) Sub1 
left join 
     (
     select row_number() over (order by col1) as rn 
     ,  * 
     from @T2 
     ) Sub2 
on  (Sub1.rn - 1) % (select count(*) from @T2) + 1 = Sub2.rn 

測試數據:

declare @t1 table (col1 int) 
declare @t2 table (col1 datetime) 

insert @t1 values (1), (2), (3), (4), (5) 
insert @t2 values ('2010-01-01'), ('2012-02-02') 

此打印:

1  2010-01-01 
2  2012-02-02 
3  2010-01-01 
4  2012-02-02 
5  2010-01-01 
+0

謝謝。聰明的想法 – CoolStraw 2010-10-14 12:22:06

1

您正在尋找一個左連接(http://www.w3schools.com/sql/sql_join_left.asp)例如。 T1 LEFT JOIN T2

說,他們都有客戶ID列在共同

SELECT * 
    FROM T1 
     LEFT JOIN 
     T2 on t1.CustomerId = T2.CustomerId 

這將返回在T1和所有記錄的匹配T2與空值的T2值,他們不匹配。

確保您在一個公共列上連接表(如果需要多個列來執行連接,則使用公共列集)。如果沒有,你正在做一個笛卡兒連接(http://ezinearticles.com/?What-is-a-Cartesian-Join?&id=3560672

+0

嗨回來了,謝謝tanging。儘管如此,我無法做到這一點,因爲我沒有條件,我所要做的就是根據它們的當前順序綁定這兩個表。我每桌只有一列,不能做「ON 」(T1有一個int,T2有一個DATETIME) – CoolStraw 2010-10-14 12:08:53