SQL查询 - 存在于其他表中或不存在

时间:2014-04-25 08:05:00

标签: sql

道歉有点令人困惑的标题。用几句话来概括这个问题很难。我正在向数据库发出请求,如下表所示:

Event

ID, startdate, offtime, meetingid reason

Meeting

ID, description

cm_delay_reasons

ID, reasoncode, reasondescription

返回的元组需要符合以下条件:

  • MeetingID中的Event需要映射到ID中的Meeting
  • reason中的Event值不能为空
  • reason 中的Event可以映射到reasoncode中的cm_delay_reasons
    • reason值也不能映射,但不能为空。
    • 如果它不为空,则不显示原因说明。

原因是后者很简单。 Event.Reason可以是代码,表示它与我们为事件预先配置的延迟之一匹配。它也可以是明文,表明用户决定了他们自己的延迟原因。目的是获得这两者,对于那些没有映射的值,将原因描述留空。

我提出的SQL查询是:

select 
    m.description, e.startdate, e.offtime, e.reason, d.reasondescription 
from 
    event e, meeting m, cm_delay_reasons d 
where 
    e.meetingid = m.id 
    and (d.reasoncode = e.reason);

但是,它并没有显示用户可以放入的自定义原因。只有cm_delay_reasons表中存在的预定义原因,所以我改变了机智并试图:

select 
    m.description, e.startdate, e.offtime, e.reason, d.reasondescription 
from 
    event e, meeting m, cm_delay_reasons d 
where 
    e.meetingid = m.id 
    and (e.reason is not null);

然而,这会造成重复。我需要解决的是如何结合两者的功能。

1 个答案:

答案 0 :(得分:0)

在我经验丰富的同事看到我遇难后,他帮助我,并解释了左外连接的概念。

 SELECT m.description, e.startdate, e.offtime, e.reason, d.reasondescription 
   FROM event e
        JOIN meeting m ON e.meetingid = m.id
        LEFT OUTER JOIN cm_delay_reasons d ON e.reason = d.reasoncode
  WHERE e.reason IS NOT NULL
  ORDER BY e.startdate;