日期:2014-05-17  浏览次数:20636 次

关于full join 3个表关联问题。
本帖最后由 a410787073 于 2013-01-29 17:27:03 编辑

select a.*,b.*,c.*
from #a a
full join #b b on a.PlateNumber=b.PlateNumber and a.PeccancyTime=b.PeccancyTime
full join #c c on a.PlateNumber=c.PlateNumber and    a.PeccancyTime=c.PeccancyTime



这样的话 a表 与b 表 就没法关联了。
求教 怎么改改 可以使   a b c  都关联上
sql full?join

------解决方案--------------------
你这个逻辑好矛盾啊,你最终想取得谁的数据?
按照你这个关联法,c表要同时查询到ab两表的字段的话,必然要ab两表是inner join的关系
如果是full join,c表也不能同时匹配a表有b表没有,且b表有a表没有的数据啊
------解决方案--------------------
我也有类似楼主的问题,举个简化的例子:
有三个表:入库表、领料表、退料表。
每个表都有四个字段,ID(自增长的),日期,料号,数量。
需要的结果是一个月中的入出记录:料号、入库数量、领料数量、退料数量。
因为某个料可能这个月只有入库,或是只有领料,或是只有退料。所以需要将三个表进行full连接。
假设每个表每天只有一条记录的情况下,下面的SQL语句:
select * from 入库表 a
full join 领料表 b on a.日期=b.日期 and a.料号=b.料号
full join 退料表 c on a.日期=c.日期 and a.料号=c.料号
当有一天,入库表没有记录,而领料表与退料表都有记录,则会变成两条记录。
------解决方案--------------------
SELECT aa.*,cc.* FROM 
(SELECT COALESCE(a.PlateNumber,b.PlateNumber) PlateNumber,COALESCE(a.PeccancyTime,b.PeccancyTime) PeccancyTime,... FROM #a a
FULL JOIN #b b ON a.PlateNumber=b.PlateNumber AND a.PeccancyTime=b.PeccancyTime) aa
FULL JOIN #c cc 
ON aa.PlateNumber=cc.PlateNumber AND aa.PeccancyTime=cc.PeccancyTime

------解决方案--------------------
引用:
SQL code?12345select a.*,b.*,c.*from #a a full outer join #b b on a.PlateNumber=b.PlateNumber and a.PeccancyTime=b.PeccancyTimefull outer join #c c on (a.PlateNumber=c.PlateNumber and a.P……

这样就可以了

select a.*,b.*,c.*
from #a a
    full join #b b on a.PlateNumber=b.PlateNumber and a.PeccancyTime=b.PeccancyTime
    full join #c c on isnull(a.PlateNumber,b.PlateNumber)=c.PlateNumber and    isnull(a.PeccancyTime,b.PeccancyTime)=c.PeccancyTime
------解决方案--------------------
引用:
上面几位高手的方法应该可行。
但之前写过一个很麻烦的,不是三个表,而是六七个表进行full join连接!
后来没办法,就是先将这六七个表union all,再left join 这六七个表。


一般都是这么写的 ,先union all,然后用union all的结果再,关联这6-7个表,这样比较有扩展性。如果还是用full join的话,很容易写错的
------解决方案--------------------
引用:
我也有类似楼主的问题,举个简化的例子:
有三个表:入库表、领料表、退料表。
每个表都有四个字段,ID(自增长的),日期,料号,数量。
需要的结果是一个月中的入出记录:料号、入库数量、领料数量、退料数量。
因为某个料可能这个月只有入库,或是只有领料,或是只有退料。所以需要将三个表进行full连接。
假设每个表每天只有一条记录的情况下,下面的SQL语句:
select * from 入库表……

如果是这种情况,那么你需要使用union all, 数量根据情况取正负值。
------解决方案--------------------