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

naturalth 2006-08-18 09:25:57
情况一
表一
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,
...全文
325 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
伊丽莎白S 2006-08-25
  • 打赏
  • 举报
回复
不知道aa bb有什么用,看起来每条记录里这两个都相等,那忽略不行?
直接以RMB,HKD这个栏位做left join,应该就好了

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

感觉没必要弄临时表那么复杂吧
proglovercn 2006-08-25
  • 打赏
  • 举报
回复
不妨设表分别为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
')


i9988 2006-08-25
  • 打赏
  • 举报
回复
好像加了一个字段?那可能不必临时表了
本来就该用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
i9988 2006-08-25
  • 打赏
  • 举报
回复
lz不好好测试的贴怎么有答案??

naturalth 2006-08-25
  • 打赏
  • 举报
回复
to hillhx(曾经的曾经),谢谢你.你的这个想法我做过.但是我这两个表是从一个表里分出来的.
然后再连接.
这个多对多是group by 后的情况.
naturalth 2006-08-25
  • 打赏
  • 举报
回复
我的主要是两个表是多对多的关系,然后要把这2张表连接起来.
Robjuan 2006-08-24
  • 打赏
  • 举报
回复
不知道是不是你要的.
Robjuan 2006-08-24
  • 打赏
  • 举报
回复
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
sjlion 2006-08-23
  • 打赏
  • 举报
回复
不用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 表四
hillhx 2006-08-23
  • 打赏
  • 举报
回复
给你个思路吧,仅仅是思路啊,语法不一定对
如果你只有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




vfssqs 2006-08-18
  • 打赏
  • 举报
回复
看不懂。楼主能不能把问题说清楚好吗??
i9988 2006-08-18
  • 打赏
  • 举报
回复
--也可这么写
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


i9988 2006-08-18
  • 打赏
  • 举报
回复
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



naturalth 2006-08-18
  • 打赏
  • 举报
回复
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

我要把这些合并一下,
berwos 2006-08-18
  • 打赏
  • 举报
回复
jf
naturalth 2006-08-18
  • 打赏
  • 举报
回复
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在数据里做好了,直接输出到表格.
再次谢谢大家!

fcuandy 2006-08-18
  • 打赏
  • 举报
回复
好像现在不确定楼主到底要什么.

如果是要我写的第一种结果,那么你的语句可以.第二种就只能用函数或动态语句来完成了.
i9988 2006-08-18
  • 打赏
  • 举报
回复
测试后再说

看问题不能光看表面

好多东西是可以互相转化的
fcuandy 2006-08-18
  • 打赏
  • 举报
回复

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
hillhx 2006-08-18
  • 打赏
  • 举报
回复
其实你根本没说清楚两个表合并的规则,比如是按行合并(如1对1,2对2)还是按字段合并(如aa=aa,bb=bb),你举的例子感觉上是按行,但又有aa,bb的,让人弄不明白。LZ还是从新把题目说一下吧,至少多举几行数据别全是aa,bb
加载更多回复(2)

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧