首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >结合使用NVL

结合使用NVL
EN

Stack Overflow用户
提问于 2021-06-05 02:15:11
回答 2查看 695关注 0票数 0

我想在表中显示两个值,但只显示“学生301”。学生102没有得到任何分数。我加入了两张桌子。这是我的问题。谢谢你的帮忙

代码语言:javascript
复制
SELECT g.student_id, NVL(g.numeric_grade, 0) AS numeric_grade, e.enrollment_date
  FROM grade_info g
  JOIN enrollment_info e 
    ON g.student_id = e.student_id
 WHERE g.student_id IN (102, 301)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-05 12:21:17

据推测,这两名学生都在enrollment_info。如果是这样,您可以使用:

代码语言:javascript
复制
SELECT e.student_id, NVL(g.numeric_grade, 0) AS numeric_grade, e.enrollment_date
FROM enrollment_info e LEFT JOIN
     grade_info g
     ON e.student_id = g.student_id
WHERE e.student_id IN (102, 301);

注意LEFT JOIN的使用。您希望保留所有行的表放在第一位。可以在WHERE子句中对此表进行筛选。虽然不是这个问题的一部分,但后续表上的过滤器(当使用LEFT JOIN时)应该在ON子句中。

还请注意使用有意义的表别名而不是任意字母。任意字母会使查询更难理解--并且容易出错。

如果两个学生都不在注册信息中,那么您需要从他们开始使用某种类型的派生表。看起来是这样的:

代码语言:javascript
复制
SELECT s.student_id, COALESCE(g.numeric_grade, 0) AS numeric_grade, e.enrollment_date
FROM (SELECT 102 as student_id FROM DUAL UNION ALL
      SELECT 301 as student_id FROM DUAL
     ) s LEFT JOIN
     enrollment_info e
     ON e.student_id = s.student_id LEFT JOIN
     grade_info g
     ON g.student_id = s.student_id;

这还使用COALESCE()而不是NVL(),因为COALESCE()是替换NULL值的标准SQL函数。

票数 0
EN

Stack Overflow用户

发布于 2021-06-05 02:38:02

您没有发布您的表结构,但是我非常肯定您需要将您的join更改为一个外连接。试试这个:

代码语言:javascript
复制
SELECT a.student_id, NVL(a.numeric_grade, 0) AS numeric_grade, b.enrollment_date
FROM enrollment_info b 
LEFT OUTER JOIN  grade_info a
ON a.student_id = b.student_id
WHERE a.student_id IN (102, 301)

NVL函数仅适用于已获取的行中的数据。空列值与缺失行不同。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67845707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档