【问题标题】:ORA-00920: invalid relational operator in select clause with multiple joins and using max valueORA-00920: 在具有多个连接并使用最大值的选择子句中无效的关系运算符
【发布时间】:2020-11-19 08:12:59
【问题描述】:

当满足以下条件时,我尝试使用 select 语句返回行:

第一个条件: 员工的 EMPLOYEE_HOME_ORG 不等于 396000 或 396010 并且 DEGREE_HIERARCHY 小于 40 并且 FACULTY_DEGREE_CODE 不等于“MS”或“MA”

第二个条件: 员工的 DEGREE_HIERARCHY 小于 40,员工的 FACULTY_SUBJECT_CODE 和 FACULTY_DEGREE_CODE 不在表 SUBJ_CODE_CROSSWALK 中。

我收到以下错误:

ORA-00920: invalid relational operator

请看下面的代码,非常感谢任何帮助!

SELECT V.FACULTY_DEGREE_CODE,
      V.FACULTY_SUBJECT_CODE,
     I.EMPLOYEE_DEPARTMENT_HOME_ORG,
      MAX(D.DEGREE_HIERARCHY)
 FROM V_DEGRESS V
      JOIN DEGREE_CROSSWALK D
          ON V.FACULTY_DEGREE_CODE =
             D.DEGREE_CODE
      JOIN I_REPORT_DETAILS I
          ON V.PIDM = I.HR_PIDM
      LEFT JOIN SUBJ_CODE_CROSSWALK S
          ON V.FACULTY_DEGREE_CODE =
             S.FACULTY_DEGREE_CODE
      LEFT JOIN SUBJ_CODE_CROSSWALK S
          ON S.FACULTY_SUBJECT_CODE =
             V.FACULTY_SUBJECT_CODE
  WHERE     V.PERSON_SKEY = 12345

      AND            
     (  
       (I.EMPLOYEE_DEPARTMENT_HOME_ORG != 396000
        and I.EMPLOYEE_DEPARTMENT_HOME_ORG != 396010)
        and (d.DEGREE_HIERARCHY < 40 )
        and 
        (V.FACULTY_DEGREE_CODE != 'MS' and
            V.FACULTY_DEGREE_CODE != 'MA')
    )
             --and NOT ONE SUBJ CODE CROSSWALK
       AND  
       (
           (D.DEGREE_HIERARCHY < 40)      
           AND 
           (V.FACULTY_SUBJECT_CODE,
               V.FACULTY_DEGREE_CODE NOT IN
                    (SELECT S.FACULTY_SUBJECT_CODE,
                            S.FACULTY_DEGREE_CODE
                       FROM SUBJ_CODE_CROSSWALK
                            S
                      WHERE     S.FACULTY_SUBJECT_CODE =
                                V.FACULTY_SUBJECT_CODE
                            AND V.FACULTY_DEGREE_CODE =
                                S.FACULTY_DEGREE_CODE
                    )
             )
          )
GROUP BY V.FACULTY_DEGREE_CODE,
      V.FACULTY_SUBJECT_CODE,
      I.EMPLOYEE_DEPARTMENT_HOME_ORG

【问题讨论】:

  • 这些括号是怎么回事???
  • LEFT JOIN的目的是什么??? WHERE 子句中的所有这些过滤器基本上将那些 LEFT JOIN 转换为 INNER JOIN
  • 您的查询似乎有两个LEFT JOIN SUBJ_CODE_CROSSWALK S 表。是这样吗?如果你需要两次加入一个表,你应该使用两个不同的别名。
  • 要添加到@TheImpaler 通知,也许您可​​以在 ON 子句中使用 AND 条件加入一次,而不是引用表两次。

标签: sql oracle max relational-operators


【解决方案1】:

除了由于您使用相同的别名两次加入表可能存在拼写错误之外,您的查询中存在语法错误。

第二个条件包含一个元组但输入错误。它应该在括号中,如(V.FACULTY_SUBJECT_CODE, V.FACULTY_DEGREE_CODE)。变化:

AND 
       (V.FACULTY_SUBJECT_CODE,
           V.FACULTY_DEGREE_CODE NOT IN
                (SELECT S.FACULTY_SUBJECT_CODE,
                        S.FACULTY_DEGREE_CODE
                   FROM ...

为:

AND 
       (V.FACULTY_SUBJECT_CODE,
           V.FACULTY_DEGREE_CODE) NOT IN
                (SELECT S.FACULTY_SUBJECT_CODE,
                        S.FACULTY_DEGREE_CODE
                   FROM ...

此外,您需要在末尾删除一个括号以确保它们正确平衡。

注意:您需要确保S.FACULTY_SUBJECT_CODES.FACULTY_DEGREE_CODE 列不包含空值。如果他们这样做,此语法将不会产生您想要的结果。您需要将此部分重新表述为“反加入”。

【讨论】:

    猜你喜欢
    • 2014-09-17
    • 2018-08-07
    • 2014-03-25
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 2014-07-07
    相关资源
    最近更新 更多