两张表A,B
A中字段:p_name,in_time
B中字段:p_name,over_time
-------------------------------------------------------------
假设A中记录为:张三 , 10
假设B中记录为:张三 , 100
执行: select a.p_name , in_time , over_time from A a , B b where a.p_name = b.p_name;
得到: p_name in_time over_time
张三 10 100
--------------------------------------------------------------
当A中无记录,B中记录为:张三 , 100
怎么能得到下面的结果:
p_name in_time over_time
张三 0 100
当B中无记录,A中记录为:张三 , 10
怎么能得到下面的结果:
p_name in_time over_time
张三 10 0
这种情况下按上面的语句,啥也得不到。
各位大侠,谁能帮忙看看怎么才能在下面两种情况下
能实现无记录的一方为0呀,谢谢了!
上面的两种情况mysql 分别可以这样:
select a.p_name , in_time ,
case when over_time is null then 0 else over_time end
from A left join B on a.p_name = b.p_name;
select b.p_name ,
case when in_time is null then 0 else in_time end,
over_time
from B left join A on a.p_name = b.p_name;
最后你需要的mysql可以这样:
select p_name,in_time,0 from a where a.p_name not in (select a.p_name from a,b where a.p_name = b.p_name) union
select p_name,0,over_time from b where b.p_name not in (select a.p_name from a,b where a.p_name = b.p_name) union
select a.p_name,in_time,over_time from a,b where a.p_name = b.p_name
SELECT CASE
WHEN N1 IS NULL THEN
N2
ELSE
N1
END P_NAME,
NVL(IN_TIME,0) IN_TIME,
NVL(OVER_TIME,0) OVER_TIME
FROM (SELECT A.p_name N1, B.p_name N2, A.in_time, B.over_time
FROM B
full JOIN A ON A.p_name = B.p_name);
oracle的写法不知道mysql可用不,优化表结构比较好
db2的可以更简洁点:
select a.p_name , coalesce(in_time,0) , coalesce(over_time,0)
from A full join B on a.p_name = b.p_name;
这个语句可以实现你说的以上两种情况