a,b你已经关联上了啊,你是不是想说b,c没办法关联了? 如果是这样,再加一句就行。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 and b.PlateNumber=c.PlateNumber and b.PeccancyTime=c.PeccancyTime
我也有类似楼主的问题,举个简化的例子: 有三个表:入库表、领料表、退料表。 每个表都有四个字段,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 a.*,b.*,c.* from #a a full outer join #b b on a.PlateNumber=b.PlateNumber and a.PeccancyTime=b.PeccancyTime full outer join #c c on (a.PlateNumber=c.PlateNumber and a.PeccancyTime=c.PeccancyTime) or (c.PlateNumber=b.PlateNumber and c.PeccancyTime=b.PeccancyTime) 今天突发奇想 这么写。试了几种情况。还可以。下午继续测试。如果没问题 就结贴了
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
这样就可以了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的地方,full join 等于两个表分别前后left join后union,如果碰到必须要使用full join的,那么你就要考虑一下表格结构,运算过程是否合理。 full join目前我只使用来生成大量测试数据。另外, full join 和 full outer join left join 和 left outer join 都是完全相同的
如果是这样,再加一句就行。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
and b.PlateNumber=c.PlateNumber and b.PeccancyTime=c.PeccancyTime
按照你这个关联法,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 a.*,b.*,c.*
from #a a
full outer join #b b on a.PlateNumber=b.PlateNumber and a.PeccancyTime=b.PeccancyTime
full outer join #c c on (a.PlateNumber=c.PlateNumber and a.PeccancyTime=c.PeccancyTime)
or (c.PlateNumber=b.PlateNumber and c.PeccancyTime=b.PeccancyTime)
今天突发奇想 这么写。试了几种情况。还可以。下午继续测试。如果没问题 就结贴了
(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
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的话,很容易写错的
full join目前我只使用来生成大量测试数据。另外,
full join 和 full outer join
left join 和 left outer join
都是完全相同的
年月、料号、期初数量、入库数量、领料数量、退料数量、退货数量、调入数量、调出数量、期末数量
所以,开始时是用的full join,后来发现内容不对,就改成先union,再left join了。
full join (领料表 b
full join 退料表 c on a.日期=c.日期 and a.料号=c.料号
)on a.日期=b.日期 and a.料号=b.料号