繁体   English   中英

Oracle SQL - WHERE 子句

[英]Oracle SQL - WHERE Clause



我是新来的,如果可以更好地措辞,请原谅我。

我需要返回以下任何人的详细信息:

'C' 级和工资不等于 9.00
或者
'D' 级和工资不等于 9.75

例如

SELECT

paam.ASSIGNMENT_NUMBER,
cs.SALARY_AMOUNT,
pgf.NAME Grade

FROM

CMP_SALARY cs,
PER_ALL_ASSIGNMENTS_M paam,
PER_GRADES_F_TL pgf

WHERE 

        pgf.GRADE_ID = paam.GRADE_ID
AND     cs.ASSIGNMENT_ID = paam.ASSIGNMENT_ID
AND     (pgf.name = 'C' AND cs.SALARY_AMOUNT <> '9.00')
                or (pgf.name = 'D' AND cs.SALARY_AMOUNT <> '9.75')

您可以提供的任何帮助将不胜感激。 :)

问题是逻辑优势。 or的优先级低于and ,因此您需要用括号将整个or条件括起来。

所以基本上改变这个:

WHERE
    pgf.GRADE_ID = paam.GRADE_ID
    AND cs.ASSIGNMENT_ID = paam.ASSIGNMENT_ID
    AND (pgf.name = 'C' AND cs.SALARY_AMOUNT <> '9.00')
    OR (pgf.name = 'D' AND cs.SALARY_AMOUNT <> '9.75')

至:

WHERE
    pgf.GRADE_ID = paam.GRADE_ID
    AND cs.ASSIGNMENT_ID = paam.ASSIGNMENT_ID
    AND (
        (pgf.name = 'C' AND cs.SALARY_AMOUNT <> '9.00')
        OR (pgf.name = 'D' AND cs.SALARY_AMOUNT <> '9.75')
    )

内括号不是严格需要的(出于上述原因),但它们使意图更清晰。

我还建议重写查询以使用标准的显式连接,而不是老式的隐式连接。 顺便说一句,这消除了优势问题:

SELECT
    paam.ASSIGNMENT_NUMBER,
    cs.SALARY_AMOUNT,
    pgf.NAME Grade
FROM CMP_SALARY cs
INNER JOIN PER_ALL_ASSIGNMENTS_M paam 
    ON cs.ASSIGNMENT_ID = paam.ASSIGNMENT_ID
INNER JOIN PER_GRADES_F_TL pgf
    ON pgf.GRADE_ID = paam.GRADE_ID
WHERE 
    (pgf.name = 'C' AND cs.SALARY_AMOUNT <> '9.00')
    OR (pgf.name = 'D' AND cs.SALARY_AMOUNT <> '9.75')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM