SQL Full Outer Join - 消除复制的列数据

时间:2016-02-22 16:58:18

标签: sql join outer-join

我想知道是否有人可以根据日期的选择参数来帮助修改我创建的查询数据的SQL查询。我面临的问题是,由于相同合同号的拟合表中的多个结果,我在结果集中显示重复的合同号。是否可以只将结果过滤到一个联系号码?

这是我的问题:

select co.contractdate condate, ff.date_ fitdate, co.contractno conno, cu.surname Surname 
from contract co 
  full outer join co_fitt ff on co.contractno = ff.contractno 
  full outer join customer cu on co.custref = cu.custref 
WHERE co.contractdate between '01/jan/2016' and '31/jan/2016' 
order by co.contractno

1 个答案:

答案 0 :(得分:0)

试试这个

SELECT co.contractdate condate,
       ff.date_        fitdate,
       co.contractno   conno,
       cu.surname      Surname
FROM   contract co
       FULL OUTER JOIN (SELECT DISTINCT contractno
                        FROM   co_fitt) ff
                    ON co.contractno = ff.contractno
                       AND co.contractdate BETWEEN '01/jan/2016' AND '31/jan/2016'
       FULL OUTER JOIN customer cu
                    ON co.custref = cu.custref
ORDER  BY co.contractno 

而不是

co.contractno as conno

使用

COALESCE(co.contractno,ff.contractno) as conno

会更有意义

同时将contractdate过滤条件移至ON条件,否则FULL OUTER JOIN将隐式转换为INNER JOIN。来自contract表的不匹配记录在NULL列中将包含contractdate值,当您过滤contractdate子句中的Where

时,这些值将被过滤