2010-10-14 127 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