2个表是多对多,我要把他连接起来怎么办?我不要full join,如果连接没有的话,我要求这个数据为空

时间:2021-08-07 17:26:19
情况一
表一
aa,bb,1,3,4
aa,bb,3,2,5
表二
aa,bb,12,3,4
结果:
aa,bb,1,3,4,12,3,4
aa,bb,3,2,5,

情况二:
表一

aa,bb,3,2,5
表二
aa,bb,12,3,4
aa,bb,1,3,4

结果:
aa,bb,3,2,5,12,3,4
aa,bb,      1,3,4,

22 个解决方案

#1


NULL NULL NULL NULL NULL NULL 12123 123123123 asdasdasd 21.00 RMB 1 21.0000
NULL NULL NULL NULL NULL NULL 12123 123123123 2313 21.00 RMB 1 21.0000
NULL NULL NULL NULL NULL NULL 12123 123123123 sdfas 21.00 RMB 1 21.0000
12123 123123123 111.00 RMB 1 111.0000 NULL NULL NULL NULL NULL NULL NULL
12123 123123123 121.00 RMB 1 121.0000 NULL NULL NULL NULL NULL NULL NULL
12123 123123123 112.00 HKD  12 1344.0000 NULL NULL NULL NULL NULL NULL NULL
12123 123123123 131.00 RMB 1 131.0000 NULL NULL NULL NULL NULL NULL NULL
12123 123123123 110.00 HKD  12 1320.0000 NULL NULL NULL NULL NULL NULL NULL
12123 123123123 102.00 RMB 1 102.0000 NULL NULL NULL NULL NULL NULL NULL

我要把这些合并一下,

#2


select *,IDENTITY(int,1,1) as id
into #t1 from 表一

select *,IDENTITY(int,1,1) as id
into #t2 from 表二

--还是full join 方便些

select isnull(a.col1,b.col1) as col1,isnull(a.col2,b.col2) as col2,
  isnull(a.col3) as col3,isnull(a.col4) as col4,isnull(a.col5) as col5,
  isnull(b.col3) as col3b,isnull(b.col4) as col4b,isnull(b.col5) as col5b
from #t1 a full join #t2 b 
on a.col1=b.col1 and a.col2 =b.col2
and (select count(*) from #t1 where col1=a.col1 and col2=a.col2 and id<=a.id)=
(select count(*) from #t2 where col1=b.col1 and col2=b.col2 and id<=b.id)




drop table #t1,#t2



#3


--也可这么写
select id,col1,col2,sum(col3) as col3,sum(col4) as col4,sum(col5) as col5,sum(col3b) as col3b,sum(col4b) as col4b,sum(col5b) as col5b
from (
select (select count(*) from #t1 where col1=a.col1 and col2=a.col2 and id<=a.id) as id,col1,col2,col3,col4,col5,cast(null as int) as col3b,cast(null as int) as col4b,cast(null as int) as col5b
from #t1 a
union all
select (select count(*) from #t2 where col1=b.col1 and col2=b.col2 and id<=b.id) as id,col1,col2,null,null,null,col3,col4,col5
from #t2 b
) as t
group by id,col1,col2


#4


看不懂。楼主能不能把问题说清楚好吗??

#5


我不是纵向合并,而是横向合并.我两个表要连接起来,通过字段关联,但是那样会出现null值,我想把连接后数据改变下,因为这样会有好多空行.

#6


我还是看不出你的逻辑,这样的数据你要取什么结果
表一
aa bb 1 3 4
aa bb 3 2 5
表二
aa bb 12 3 4
aa bb 12 3 5

#7


其实你根本没说清楚两个表合并的规则,比如是按行合并(如1对1,2对2)还是按字段合并(如aa=aa,bb=bb),你举的例子感觉上是按行,但又有aa,bb的,让人弄不明白。LZ还是从新把题目说一下吧,至少多举几行数据别全是aa,bb

#8


是 
aa bb 1 3 4 12 3 4
aa bb 3 2 5 12 3 5
还是

aa bb 1 3 4 12 3 4 12 3 5
aa bb 1 3 4

#9


测试后再说

看问题不能光看表面

好多东西是可以互相转化的

#10


好像现在不确定楼主到底要什么.

如果是要我写的第一种结果,那么你的语句可以.第二种就只能用函数或动态语句来完成了.

#11


aa,bb,3,2,5,12,3,4
aa,bb, , ,1,3,4
谢谢大家关心.
问题我描述的不清楚.
再说下.
我现在有2张表,
我要把两张表连接起来.
通过 aa,bb连接,
主要问题在与:
现在可能表1有5条数据是以
aa,bb,RMB,232
aa,bb,UK,232
aa,bb,HK,232
aa,bb,DOC,232
aa,bb,EUR,232
表2有3条数据
aa,bb,RMB,232
aa,bb,HK,232
aa,bb,EUR,232
我要得到结果:
aa,bb,RMB,232,RMB,232
aa,bb,UK,232,null,null
aa,bb,HK,232,HK,232
aa,bb,DOC,232, null,null
aa,bb,EUR,232,EUR,232
当然还有一情况就是表1变成表2,表2变成表一

我主要做个报表,把数据全部用sql在数据里做好了,直接输出到表格.
再次谢谢大家!

#12


jf

#13


给你个思路吧,仅仅是思路啊,语法不一定对
如果你只有AA,BB的话能这么搞,否则最好用临时表加游标搞

declare @i_count1 int
declare @i_count2 int


select identity(1,1)as row_id , * into #tb1 from t1
set @i_count1 = isnull(@@identity,0)

select identity(1,1)as row_id , * into #tb2 from t2
set @i_count2 = isnull(@@identity,0)

if @i_count1 > @i_count2 then
   select a,b, #t1.c,#t1.d,#t2.c,#t2.d from #t1 left join #t2 on a=a and b=b and row_id = row_id 
else 
   ........
end if




#14


不用full join可以用left join加子查询呀。两个表结构一样吧?那就当你的列名是a,b,c,d
select a,b,c,d,e,f from (select * from 表一 left join (select a aa,b bb,c e,d f from 表二) as 表三 on 表一.a=表二.aa and 表一.b=表二.bb) as 表四

#15


declare @t1 table(a varchar(10),b varchar(10),c varchar(10),d varchar(10))
declare @t2 table(a varchar(10),b varchar(10),c varchar(10),d varchar(10))

insert into @t1
select 'aa','bb','rmb','232'
union 
select 'aa','bb','uk','231'
union 
select 'aa','bb','hk','231'
union 
select 'aa','bb','doc','231'
union 
select 'aa','bb','eur','231'
union 
select 'aa','bb','ge','231'


insert into @t2
select 'aa','bb','rmb','232'
union 
select 'aa','bb','uk','231'
union 
select 'aa','bb','hk','231'
union 
select 'aa','bb','doc','231'
union 
select 'aa','bb','eur','231'
union 
select 'aa','bb','kor','231'


select t1.a,t1.b,t1.c,t1.d,t2.c,t2.d from @t1 t1
left join @t2 t2 on  t1.a=t2.a and t1.b=t2.b and t1.c=t2.c
union
select t2.a,t2.b,t2.c,t2.d,t1.c,t1.d from @t2 t2
left join @t1 t1 on  t1.a=t2.a and t1.b=t2.b and t1.c=t2.c

#16


不知道是不是你要的.

#17


我的主要是两个表是多对多的关系,然后要把这2张表连接起来.

#18


to hillhx(曾经的曾经),谢谢你.你的这个想法我做过.但是我这两个表是从一个表里分出来的.
然后再连接.
这个多对多是group by 后的情况.

#19


lz不好好测试的贴怎么有答案??

#20


好像加了一个字段?那可能不必临时表了
本来就该用full join

select isnull(a.col1,b.col1) as col1,isnull(a.col2,b.col2) as col2,
  a.col3,a.col4,b.col3,b.col4
from 表1 a full join 表2 b 
on a.col1=b.col1 and a.col2 =b.col2 and a.col3 =b.col3

#21


不妨设表分别为a,b
<一>使用“full join”
select isnull(c.a,d.a),isnull(c.b,d.b),isnull(c.c,d.c),c.d,d.c,d.d
from c
full join
d
on c.a=d.a
and c.b=d.b
and c.c=d.c
<二>不使用“full join”
declare @a as varchar(20)
declare @b as varchar(20)
if (select count(*) from c)>(select count(*) from d)
begin
set @a='c'
set @b='d'
end
else
begin
set @a='d'
set @b='c'
end

exec('
select a.a,a.b,a.c,a.d,b.c,b.d
from '+@a+' a
left join
'+@b+'  b
on a.a=b.a
and a.b=b.b
and a.c=b.c
')


#22


不知道aa bb有什么用,看起来每条记录里这两个都相等,那忽略不行?
直接以RMB,HKD这个栏位做left join,应该就好了

如果嫌已经是查询后的结果,再连接sql语句太长麻烦的话,把本来的这两个是查询结果的表做成view,再操作不就好了?

感觉没必要弄临时表那么复杂吧

#1


NULL NULL NULL NULL NULL NULL 12123 123123123 asdasdasd 21.00 RMB 1 21.0000
NULL NULL NULL NULL NULL NULL 12123 123123123 2313 21.00 RMB 1 21.0000
NULL NULL NULL NULL NULL NULL 12123 123123123 sdfas 21.00 RMB 1 21.0000
12123 123123123 111.00 RMB 1 111.0000 NULL NULL NULL NULL NULL NULL NULL
12123 123123123 121.00 RMB 1 121.0000 NULL NULL NULL NULL NULL NULL NULL
12123 123123123 112.00 HKD  12 1344.0000 NULL NULL NULL NULL NULL NULL NULL
12123 123123123 131.00 RMB 1 131.0000 NULL NULL NULL NULL NULL NULL NULL
12123 123123123 110.00 HKD  12 1320.0000 NULL NULL NULL NULL NULL NULL NULL
12123 123123123 102.00 RMB 1 102.0000 NULL NULL NULL NULL NULL NULL NULL

我要把这些合并一下,

#2


select *,IDENTITY(int,1,1) as id
into #t1 from 表一

select *,IDENTITY(int,1,1) as id
into #t2 from 表二

--还是full join 方便些

select isnull(a.col1,b.col1) as col1,isnull(a.col2,b.col2) as col2,
  isnull(a.col3) as col3,isnull(a.col4) as col4,isnull(a.col5) as col5,
  isnull(b.col3) as col3b,isnull(b.col4) as col4b,isnull(b.col5) as col5b
from #t1 a full join #t2 b 
on a.col1=b.col1 and a.col2 =b.col2
and (select count(*) from #t1 where col1=a.col1 and col2=a.col2 and id<=a.id)=
(select count(*) from #t2 where col1=b.col1 and col2=b.col2 and id<=b.id)




drop table #t1,#t2



#3


--也可这么写
select id,col1,col2,sum(col3) as col3,sum(col4) as col4,sum(col5) as col5,sum(col3b) as col3b,sum(col4b) as col4b,sum(col5b) as col5b
from (
select (select count(*) from #t1 where col1=a.col1 and col2=a.col2 and id<=a.id) as id,col1,col2,col3,col4,col5,cast(null as int) as col3b,cast(null as int) as col4b,cast(null as int) as col5b
from #t1 a
union all
select (select count(*) from #t2 where col1=b.col1 and col2=b.col2 and id<=b.id) as id,col1,col2,null,null,null,col3,col4,col5
from #t2 b
) as t
group by id,col1,col2


#4


看不懂。楼主能不能把问题说清楚好吗??

#5


我不是纵向合并,而是横向合并.我两个表要连接起来,通过字段关联,但是那样会出现null值,我想把连接后数据改变下,因为这样会有好多空行.

#6


我还是看不出你的逻辑,这样的数据你要取什么结果
表一
aa bb 1 3 4
aa bb 3 2 5
表二
aa bb 12 3 4
aa bb 12 3 5

#7


其实你根本没说清楚两个表合并的规则,比如是按行合并(如1对1,2对2)还是按字段合并(如aa=aa,bb=bb),你举的例子感觉上是按行,但又有aa,bb的,让人弄不明白。LZ还是从新把题目说一下吧,至少多举几行数据别全是aa,bb

#8


是 
aa bb 1 3 4 12 3 4
aa bb 3 2 5 12 3 5
还是

aa bb 1 3 4 12 3 4 12 3 5
aa bb 1 3 4

#9


测试后再说

看问题不能光看表面

好多东西是可以互相转化的

#10


好像现在不确定楼主到底要什么.

如果是要我写的第一种结果,那么你的语句可以.第二种就只能用函数或动态语句来完成了.

#11


aa,bb,3,2,5,12,3,4
aa,bb, , ,1,3,4
谢谢大家关心.
问题我描述的不清楚.
再说下.
我现在有2张表,
我要把两张表连接起来.
通过 aa,bb连接,
主要问题在与:
现在可能表1有5条数据是以
aa,bb,RMB,232
aa,bb,UK,232
aa,bb,HK,232
aa,bb,DOC,232
aa,bb,EUR,232
表2有3条数据
aa,bb,RMB,232
aa,bb,HK,232
aa,bb,EUR,232
我要得到结果:
aa,bb,RMB,232,RMB,232
aa,bb,UK,232,null,null
aa,bb,HK,232,HK,232
aa,bb,DOC,232, null,null
aa,bb,EUR,232,EUR,232
当然还有一情况就是表1变成表2,表2变成表一

我主要做个报表,把数据全部用sql在数据里做好了,直接输出到表格.
再次谢谢大家!

#12


jf

#13


给你个思路吧,仅仅是思路啊,语法不一定对
如果你只有AA,BB的话能这么搞,否则最好用临时表加游标搞

declare @i_count1 int
declare @i_count2 int


select identity(1,1)as row_id , * into #tb1 from t1
set @i_count1 = isnull(@@identity,0)

select identity(1,1)as row_id , * into #tb2 from t2
set @i_count2 = isnull(@@identity,0)

if @i_count1 > @i_count2 then
   select a,b, #t1.c,#t1.d,#t2.c,#t2.d from #t1 left join #t2 on a=a and b=b and row_id = row_id 
else 
   ........
end if




#14


不用full join可以用left join加子查询呀。两个表结构一样吧?那就当你的列名是a,b,c,d
select a,b,c,d,e,f from (select * from 表一 left join (select a aa,b bb,c e,d f from 表二) as 表三 on 表一.a=表二.aa and 表一.b=表二.bb) as 表四

#15


declare @t1 table(a varchar(10),b varchar(10),c varchar(10),d varchar(10))
declare @t2 table(a varchar(10),b varchar(10),c varchar(10),d varchar(10))

insert into @t1
select 'aa','bb','rmb','232'
union 
select 'aa','bb','uk','231'
union 
select 'aa','bb','hk','231'
union 
select 'aa','bb','doc','231'
union 
select 'aa','bb','eur','231'
union 
select 'aa','bb','ge','231'


insert into @t2
select 'aa','bb','rmb','232'
union 
select 'aa','bb','uk','231'
union 
select 'aa','bb','hk','231'
union 
select 'aa','bb','doc','231'
union 
select 'aa','bb','eur','231'
union 
select 'aa','bb','kor','231'


select t1.a,t1.b,t1.c,t1.d,t2.c,t2.d from @t1 t1
left join @t2 t2 on  t1.a=t2.a and t1.b=t2.b and t1.c=t2.c
union
select t2.a,t2.b,t2.c,t2.d,t1.c,t1.d from @t2 t2
left join @t1 t1 on  t1.a=t2.a and t1.b=t2.b and t1.c=t2.c

#16


不知道是不是你要的.

#17


我的主要是两个表是多对多的关系,然后要把这2张表连接起来.

#18


to hillhx(曾经的曾经),谢谢你.你的这个想法我做过.但是我这两个表是从一个表里分出来的.
然后再连接.
这个多对多是group by 后的情况.

#19


lz不好好测试的贴怎么有答案??

#20


好像加了一个字段?那可能不必临时表了
本来就该用full join

select isnull(a.col1,b.col1) as col1,isnull(a.col2,b.col2) as col2,
  a.col3,a.col4,b.col3,b.col4
from 表1 a full join 表2 b 
on a.col1=b.col1 and a.col2 =b.col2 and a.col3 =b.col3

#21


不妨设表分别为a,b
<一>使用“full join”
select isnull(c.a,d.a),isnull(c.b,d.b),isnull(c.c,d.c),c.d,d.c,d.d
from c
full join
d
on c.a=d.a
and c.b=d.b
and c.c=d.c
<二>不使用“full join”
declare @a as varchar(20)
declare @b as varchar(20)
if (select count(*) from c)>(select count(*) from d)
begin
set @a='c'
set @b='d'
end
else
begin
set @a='d'
set @b='c'
end

exec('
select a.a,a.b,a.c,a.d,b.c,b.d
from '+@a+' a
left join
'+@b+'  b
on a.a=b.a
and a.b=b.b
and a.c=b.c
')


#22


不知道aa bb有什么用,看起来每条记录里这两个都相等,那忽略不行?
直接以RMB,HKD这个栏位做left join,应该就好了

如果嫌已经是查询后的结果,再连接sql语句太长麻烦的话,把本来的这两个是查询结果的表做成view,再操作不就好了?

感觉没必要弄临时表那么复杂吧