2

首先 - 已经在这里看过一个类似的问题,但它与我的问题并不完全相关。

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

第三,我相信我知道为什么会发生错误 - 子查询(y)(ies)正在影响外部查询的顺序(可能),因此无法根据查询嵌套的方式创建顺序.

这是查询:

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在查询中没有任何意义。

所以我的问题是......我怎样才能以这样的方式“包装”查询(如此处所引用,我可以对结果进行排序E.lname

我已经尝试过 9,000 多种方式来包装它,但我还没有找到可行的解决方案。我也是 SQL 的新手,所以我怀疑我是否可以更改查询的结构,以使用比我目前拥有的任何数量少的子查询来给我相同的结果。

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

4

2 回答 2

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;
于 2013-03-29T04:37:17.893 回答
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
于 2013-03-29T04:37:38.500 回答