【问题标题】:Using NVL with JOIN将 NVL 与 JOIN 结合使用
【发布时间】:2021-06-05 02:15:11
【问题描述】:

我想在表格中显示 2 个值,但只显示学生 301。学生 102 没有收到任何成绩。我加入了两张桌子。这是我的查询。感谢您的帮助

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)

【问题讨论】:

    标签: sql oracle join


    【解决方案1】:

    您没有发布您的表结构,但我很确定您需要将您的联接更改为OUTER join。试试这个:

    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】:

      大概两个学生都在enrollment_info。如果是这样,您可以使用:

      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 子句中。

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

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

      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 函数。

      【讨论】:

        猜你喜欢
        • 2021-12-10
        • 2013-01-24
        • 1970-01-01
        • 1970-01-01
        • 2021-01-01
        • 2019-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多