Oracle SQL(加)ORDER BY - 无效标识符(嵌套子查询)

时间:2013-03-29 04:18:05

标签: oracle sql-order-by subquery

首先 - 已经查看过类似的问题here,但这与我的问题并不完全相同。

其次,这是一个家庭作业,但问题与SQL语法有关 - 我已经编写了查询,结果是按预期的,只是无序的。

第三,我相信我知道错误发生的原因 - 子查询(y)正在影响外部查询的排序(可能),因此无法根据查询是嵌套的。

以下是查询:

SELECT DISTINCT E.ssn, E.lname
FROM employee E, works_on W
WHERE E.ssn = W.essn AND
W.pno NOT IN
    (SELECT P.pnumber
    FROM project P
    WHERE P.plocation = 'Houston')
    MINUS
    (SELECT E.ssn, E.lname
    FROM employee E, works_on W, project P
    WHERE E.ssn = W.essn AND
    W.pno = P.pnumber AND
    P.plocation = 'Houston')
ORDER BY E.lname;

SSN       LNAME                                                                 
--------- ---------------                                                       
123456789 Smith                                                                 
453453453 English                                                               
987987987 Jabbar                                                                
999887777 Zelaya

现在,如果我从查询末尾删除ORDER BY E.lname,它运行正常。否则,我收到“无效标识符”错误。我认为这是因为E.lname在查询中没有任何意义。

所以我的问题是......如何以这样的方式“封装”查询(引用here),我可以按E.lname对结果进行排序?

我已经尝试将其包装在超过9,000种方式中,但我还没有找到可行的解决方案。我也是SQL的新手,所以我怀疑我可以改变查询的结构,使用少于我现有的任何数量的子查询给我相同的结果。

感谢任何花时间帮助我的人,非常感谢!如果有必要提供表创建代码,请告诉我!

2 个答案:

答案 0 :(得分:4)

我知道你尝试了9000种方法,但是

SELECT ssn,lname from
(
SELECT DISTINCT E.ssn, E.lname
FROM employee E, works_on W
WHERE E.ssn = W.essn AND
W.pno NOT IN
    (SELECT P.pnumber
    FROM project P
    WHERE P.plocation = 'Houston')
    MINUS
    (SELECT E.ssn, E.lname
    FROM employee E, works_on W, project P
    WHERE E.ssn = W.essn AND
    W.pno = P.pnumber AND
    P.plocation = 'Houston')
)
ORDER BY lname;

或使用序数表示法,

SELECT DISTINCT E.ssn, E.lname
FROM employee E, works_on W
WHERE E.ssn = W.essn AND
W.pno NOT IN
    (SELECT P.pnumber
    FROM project P
    WHERE P.plocation = 'Houston')
    MINUS
    SELECT E.ssn, E.lname
    FROM employee E, works_on W, project P
    WHERE E.ssn = W.essn AND
    W.pno = P.pnumber AND
    P.plocation = 'Houston'

ORDER BY 2;

答案 1 :(得分:1)

您是否正在尝试删除在休斯顿从事某个项目的员工?然后,这应该使用LEFT JOIN

SELECT DISTINCT E.ssn, E.lname
FROM employee E
   INNER JOIN works_on W 
       ON E.ssn = W.essn AND
   LEFT JOIN project P 
       ON w.pno = p.pnumber AND P.plocation = 'Houston'
WHERE p.pnumber IS NULL
ORDER BY E.lname