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
- 如果不为空,则不显示原因说明
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吗?不是。我的同事提出了一个解决方案,所以我想我应该在这里介绍一下。当你知道怎么做的时候,这很简单!详情如下: