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

SQL查询-存在于其他表中或不存在,sql,Sql,为这个有点混乱的标题道歉。很难用几句话来概括这个问题。我正在向以下表格中的数据库发出请求: 事件: ID, startdate, offtime, meetingid reason 会议: ID, description cm\u延迟原因: ID, reasoncode, reasondescription 返回的元组需要符合以下条件: 事件中的会议ID需要映射到会议中的ID 事件中的原因值不能为空 Event中的reason值可以映射到cm\u delay\u reasons中的rea

为这个有点混乱的标题道歉。很难用几句话来概括这个问题。我正在向以下表格中的数据库发出请求:

事件

ID, startdate, offtime, meetingid reason
会议

ID, description
cm\u延迟原因

ID, reasoncode, reasondescription
返回的元组需要符合以下条件:

  • 事件中的
    会议ID
    需要映射到
    会议中的
    ID
  • 事件
    中的
    原因
    值不能为空
  • Event
    中的
    reason
    值可以映射到
    cm\u delay\u reasons
    中的
    reasoncode
    • 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);
然而,ths并没有显示用户可以输入的自定义原因。只有
cm\u delay\u 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);

但是,这会导致重复。我需要解决的是如何将两者的功能结合起来。

在我经验丰富的同事看到我陷入困境后,他帮助我解决了问题,并解释了左外连接的概念

 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;

不确定我是否完全理解,但如果这只是重复的问题,为什么不使用
选择DISTINCT
?-那种旧式的逗号分隔的表列表样式在ANSI-92 SQL标准(20多年前)中已经停止了。是的,我是一个差劲的SQL开发人员。我只是学到了足够的东西,可以边走边过日子。。这是一个产生了一些问题的实践。你需要在某些事情上映射到cm_延迟_的原因,否则你现在将如何确定哪些延迟是针对哪个事件的?cm_delay_中的ID是Event.ID的FK吗?不是。我的同事提出了一个解决方案,所以我想我应该在这里介绍一下。当你知道怎么做的时候,这很简单!详情如下: