我有一个复杂的情况,我一直试图弄清楚加入两个表。基本结构是我有表S
,其中包含name,num,box,以及包含相同4个字段,name,num,box和user的用户和表D
。
我可以轻松地匹配盒子和用户,但它还不够。我还需要在可能的情况下匹配名称。
Dave,1234,3,jon
Scot,1111,3,jon
Bill,4389,3,abe
Mark,3333,3,jon
Dave,3355,3,jon
Lime,9832,6,jon
我需要的结果是什么
Dave,1234,3355,3,jon
Scot,1111,null,3,jon
Mark,null,3333,3,jon
我尝试了几种不同的连接类型,但问题是这些表没有排列的ID,并且名称可能存在于两者中但不是必需的。如果它确实存在,我想要两者的数字,但只有一个名称。
答案 0 :(得分:0)
首先,我想说DB设计需要工作。
但是如果你无法改变设计,我认为nave变量的完整外连接将为你提供所需的东西。
答案 1 :(得分:0)
此解决方案适用于您提供的数据。我不确定数据中是否还有更多内容:。
select s.name, s.num, d.num, s.box, s.user from s, d where s.name = d.name
union
select s.name, s.num, "null", s.box, s.user from s where s.name not in (select s.name from s, d where s.name = d.name)
union
select d.name, "null",d.num, d.box, d.user from d where d.name not in (select s.name from s, d where s.name = d.name)
点击Demo此处。
答案 2 :(得分:0)
从其他来源获得一些帮助,我能够扩展Prerak提供的答案,并使用包含工会的子查询提出以下内容
select * from (
select s.name, s.num as sNum, d.num as dNum, s.board, s.username from s, d where s.name = d.name
union
select s.name, s.num as sNum, "null", s.board, s.username from s where s.name not in (select s.name from s, d where s.name = d.name)
union
select d.name, "null",d.num as dNum, d.board, d.username from d where d.name not in (select s.name from s, d where s.name = d.name)
) as dataTab
where user = 'jon' and box = 3