请教:查找一个表中存在而另一个表中不存在的记录

raulzzz11111 2013-10-26 01:04:11
月份表month中有1-12月12条记录
但是实际每月项目表中,项目并不是每月都有。
如何查询实现 第一列是1-12月的月份都显示出来,当月有项目就显示项目,没有就显示为空,但这一行要显示出来
...全文
1396 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
绕天涯_2014 2015-02-10
  • 打赏
  • 举报
回复
使用表的外连接查询,左向外联接的结果集包括 LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。
王大惑 2014-11-16
  • 打赏
  • 举报
回复
方法楼上的都给出了,在这我想说下在外连接时,一定要注意主次表的使用、关联条件必须准确。在我第一次使用外连接时就没有注意这些问题,在此希望能给你帮助。
清泉灵弦 2014-11-16
  • 打赏
  • 举报
回复
错了,是以月份为匹配,改成这个select * from table1 left join table2 on a.month=b.month,默认会以左侧为准,右侧补空
清泉灵弦 2014-11-16
  • 打赏
  • 举报
回复
left join即可,select * from table1 left join table2 on a.id=b.id,默认会以左侧为准,右侧补空
ffshao 2014-11-14
  • 打赏
  • 举报
回复
引用 1 楼 huanqingdong 的回复:
select T1.月份,T2.项目名称 from 月份表 T1 LEFT JOIN 项目表 T2 ON T1.月份=T2.月份 order by T1.月份
在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定: 1)LEFT JOIN或LEFT OUTER JOIN 左向外联接的结果集包括 LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。 2)RIGHT JOIN 或 RIGHT OUTER JOIN 右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。 3)FULL JOIN 或 FULL OUTER JOIN 完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。 而NOT IN速度很慢,因为这样会存在两个全表检索的情况,而且,not in (...) 括号中的返回值不能存在null值,是Oracle SQL开发的一条铁律 因此,请尽量不要使用not in(它会调用子查询)。
小麻雀NG 2014-11-13
  • 打赏
  • 举报
回复
not in 在查询多条数据时,效率很慢,使用外连接比较好, select * from mymonth m left join mywork w on m.month=w.month order by m.month;
yiyongle 2014-09-03
  • 打赏
  • 举报
回复
同楼上,使用左连接 select yuefen.month xiangmu.xiangmumc from yuefen T1 LEFT JOIN xiangmu T2 ON T1.month=T2.month
卖水果的net 2014-04-17
  • 打赏
  • 举报
回复
with m12 as (select rownum as monthid from dual connect by rownum <=12)
select m12.monthid , xm.* from m12 left join xm on m12.monthid = xm.monthid
再改改,大概就是这个语法,我没有环境,也没有测试,有问题可以直接回复我。
king5645608 2014-04-15
  • 打赏
  • 举报
回复
引用 6 楼 dreamjun 的回复:
同意楼上的,用连接表应该是比较好的解决方法。或者你可以用not in,逻辑上比较好理解,不过执行效率比较慢
select m.* from month1 m where m.month not in (select month from month2)
显示全部数据不得用not in
WSZHAO_SELECT 2014-03-06
  • 打赏
  • 举报
回复
我觉得你这个问题你使用左连接是最简单的:
select * from mymonth m left join mywork w on m.month=w.month order by m.month;
qgbin 2013-10-29
  • 打赏
  • 举报
回复
Select a.月份,sum(b.值) As 值 From 月份 a,项目 b Where a.月份=b.月份(+) Group By a.月份 Order By a.月份
dreamjun 2013-10-28
  • 打赏
  • 举报
回复
同意楼上的,用连接表应该是比较好的解决方法。或者你可以用not in,逻辑上比较好理解,不过执行效率比较慢
select m.* from month1 m where m.month not in (select month from month2)
sych888 2013-10-28
  • 打赏
  • 举报
回复
minus ......
  • 打赏
  • 举报
回复
通过 你月份表(month) 左连接 项目表(exp). SQL例子如下:

    select m.month_,e.* from month m
    left join exp e on e.month_ = m.month_
    --左连接解释:月份表month通过月份连接exp项目表,即已month为主表,
    --不管项目表exp有没有都会有记录。
    --①当exp表连接无数据时,会只展示一条month记录而其他为空。
    --②当exp表连接有数据是,根据连接到的项目记录数,生成相应的连接数据记录条数。
善若止水 2013-10-26
  • 打赏
  • 举报
回复
你这涉及到左外连接的问题,先建立保存1到12月的表,然后对表进行关联汇总,注意是左外连接
醉爱梁静茹 2013-10-26
  • 打赏
  • 举报
回复
select m.yf,o.objxx from month m left join object_test o on m.yf=o.yf order by m.yf desc;
Wentasy 2013-10-26
  • 打赏
  • 举报
回复
外连接就可以解决啦。
faith.huan 2013-10-26
  • 打赏
  • 举报
回复
select T1.月份,T2.项目名称 from 月份表 T1 LEFT JOIN 项目表 T2 ON T1.月份=T2.月份 order by T1.月份

17,382

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧