首先 - 已经查看过类似的问题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的新手,所以我怀疑我可以改变查询的结构,使用少于我现有的任何数量的子查询给我相同的结果。
感谢任何花时间帮助我的人,非常感谢!如果有必要提供表创建代码,请告诉我!
答案 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