SQLServer连接两个表

时间:2010-10-14 12:00:54

标签: sql sql-server sql-server-2005

我已经要问你了,我在尝试合并两张桌子时遇到了困难,我无法找到正确的查询。

我有两张桌子: T1:1列,有X记录 T2:1列,有Y记录 注意:Y永远不会大于X,但它通常小于这个

我想加入这些表,以便拥有一个包含两列的表 t3:ColumnFromT1,columnFromT2。

当Y小于X时,T2字段值会重复并分布在我所有其他值上,但是当我使用T2中的所有列时,我想得到NULL。

我怎么能实现这一目标? 感谢

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您正在寻找LEFT JOIN(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