我已经要问你了,我在尝试合并两张桌子时遇到了困难,我无法找到正确的查询。
我有两张桌子: T1:1列,有X记录 T2:1列,有Y记录 注意:Y永远不会大于X,但它通常小于这个
我想加入这些表,以便拥有一个包含两列的表 t3:ColumnFromT1,columnFromT2。
当Y小于X时,T2字段值会重复并分布在我所有其他值上,但是当我使用T2中的所有列时,我想得到NULL。
我怎么能实现这一目标? 感谢
答案 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)