【问题标题】:Row not returning NULL行不返回 NULL
【发布时间】:2013-11-08 20:14:15
【问题描述】:

我正在尝试选择学生以及他们每个人的注册人数。因此,如果学生根本没有注册任何课程,我想显示 0 或无。在我可以这样做之前,我希望该行返回 null,但它没有发生。它给了我正确的结果,除了我没有为空的行。

SELECT s.STUDENT_ID, z.COURSE_NO, e.ENROLL_DATE, COUNT(*) AS ENROLLED
FROM STUDENT s,ENROLLMENT e, SECTION z
WHERE s.STUDENT_ID = e.STUDENT_ID
AND e.SECTION_ID = z.SECTION_ID
AND s.PHONE LIKE '702%'
GROUP BY s.STUDENT_ID, z.COURSE_NO, e.ENROLL_DATE

因此,如果它确实为尚未注册任何课程的学生返回 null,我想做这样的事情

SELECT lt.STUDENT_ID,lt.FIRST_NAME, lt.LAST_NAME, NVL(COUNT(ENROLLED), 0) AS ENROLLED
FROM STUDENT lt
LEFT OUTER JOIN
(SELECT s.STUDENT_ID, z.COURSE_NO, e.ENROLL_DATE, COUNT(*) AS ENROLLED
FROM STUDENT s,ENROLLMENT e, SECTION z
WHERE s.STUDENT_ID = e.STUDENT_ID
AND e.SECTION_ID = z.SECTION_ID
AND s.PHONE LIKE '702%'
GROUP BY s.STUDENT_ID, z.COURSE_NO, e.ENROLL_DATE) rt
ON lt.STUDENT_ID = rt.STUDENT_ID
GROUP BY lt.STUDENT_ID,lt.FIRST_NAME, lt.LAST_NAME;

如何获得返回 null 的行?

【问题讨论】:

  • 你应该停止使用隐式连接。它们是一个 asql 反模式,并且在 20 年前为了上帝的缘故被补充了。并且在任何情况下都不要同时使用隐式和显式连接,否则您很可能会得到不正确的结果。

标签: sql oracle null left-join


【解决方案1】:

使用LEFT [OUTER] JOIN

SELECT s.STUDENT_ID, z.COURSE_NO, e.ENROLL_DATE, COUNT(*) AS ENROLLED
FROM   STUDENT         s
LEFT   JOIN ENROLLMENT e ON e.STUDENT_ID = s.STUDENT_ID 
LEFT   JOIN SECTION    z ON z.SECTION_ID = e.SECTION_ID
WHERE  s.PHONE LIKE '702%'
GROUP  BY s.STUDENT_ID, z.COURSE_NO, e.ENROLL_DATE

Details in the language reference.

【讨论】:

  • 解决了问题...无论我使用什么查询,我总是得到相同的答案。这真的很有帮助..谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-05-24
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 2016-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多