Emp(eid: integer, ename: string, age: integer, salary: real)
Works(eid: integer, did: integer, pct time: integer)
Dept(did: integer, dname: string, budget: real, managerid: integer)
SELECT DISTINCT D.managerid
FROM Dept D
WHERE 1000000 < ALL (SELECT D2.budget
FROM Dept D2
WHERE D2.managerid = D.managerid )
other one:
SELECT DISTINCT managerid FROM dept WHERE dept.budget > 1000000
他们都得到了在预算超过100万的部门工作的经理人的身份。抱歉格式化。
答案 0 :(得分:2)
区别在于ALL
运算符。与比较运算符一起使用时,请阅读有关ALL运算符的here。
不同之处在于经理监督多个部门的情况。
如果您有一位管理这两个部门的经理:
declare @Dept table (did integer, dname varchar(20), budget real, managerid integer)
insert into @Dept values(1, 'dept1', 10, 1),(2, 'dept2', 20000000, 1)
然后第一个查询不会给你任何结果,因为managerid = 1的经理有一个预算超过且少于1000000的部门
SELECT DISTINCT D.managerid
FROM @Dept D
WHERE 1000000 < ALL (SELECT D2.budget
FROM @Dept D2
WHERE D2.managerid = D.managerid )
managerid
-----------
(0 row(s) affected)
第二个查询愉快地返回结果:
SELECT DISTINCT managerid FROM @dept WHERE budget > 1000000
managerid
-----------
1
(1 row(s) affected)
更新:要使两个查询等效,您可以使用ANY
运算符:
SELECT DISTINCT D.managerid
FROM @Dept D
WHERE 1000000 < ANY (SELECT D2.budget
FROM @Dept D2
WHERE D2.managerid = D.managerid )
managerid
-----------
1
(1 row(s) affected)
为了完整性,我在此处添加了上面网址中的图片: