2013-02-14 179 views
0

我只需要大约SQL一点帮助查询SQL子查询多个值

这里的情况

ID FIRST_NAME LAST_NAME START_DAT END_DATE SALARY  CITY  DESCRIPTION 
---- ---------- ---------- --------- --------- ---------- ---------- --------------- 
01 Jason  Martin  25-JUL-96 25-JUL-06 1234.56 Toronto Programmer 
02 Alison  Mathews 21-MAR-76 21-FEB-86 6661.78 Vancouver Tester 
03 James  Smith  12-DEC-78 15-MAR-90 6544.78 Vancouver Tester 
04 Celia  Rice  24-OCT-82 21-APR-99 2344.78 Vancouver Manager 
05 Robert  Black  15-JAN-84 08-AUG-98 2334.78 Vancouver Tester 
06 Linda  Green  30-JUL-87 04-JAN-96 4322.78 New York Tester 
07 David  Larry  31-DEC-90 12-FEB-98 7897.78 New York Manager 
08 James  Cat  17-SEP-96 15-APR-02 1232.78 Vancouver Tester 

8 rows selected. 

SQL> -- GROUP BY clause and AVG() function 

SQL> SELECT city, AVG(salary) 
2 FROM employee 
3 GROUP BY city; 


CITY AVG(SALARY) 
---------- ----------- 
New York 6110.28 

Toronto 1234.56 

Vancouver 3823.78 

问题是我不能找到一种方法来提取每个avg(salary)具有较高的薪水那些名字城市

例子:

温哥华的3823.78 avg(salary)所以我应该得到的2人名称:Alison和詹姆斯·贝科使用它们比纽约

avg(salary)较高的收入,现在我只去这个查询,但不工作

select FIRST_NAME,SALARY,CITY 
from employee 
where SALARY > ( select avg(SALARY) 
        from employee 
        group by CITY 
       ); 

它告诉我,子查询返回多个值

希望有人能帮我

回答

2

您的查询返回多个值。将其限制为一个值,你需要city条件:

select FIRST_NAME,SALARY,CITY 
from employee e 
where SALARY > (select avg(SALARY) 
       from employee e2 
       where e2.city = e.city 
       group by CITY); 

这就是所谓的相关子查询。你也可以把它写成一个连接,这是我将使用的语法。严格来说,group by CITY是不必要的,但我认为它使得子查询的意图更清晰。

您可以改写这是做一个连接:

select e.FIRST_NAME, e.SALARY, e.CITY 
from employee e join 
    (select city, avg(salary) as avgSalary 
     from employee 
     group by city 
    ) ec 
    on e.city = ec.city 
where e.salary > ec.avgSalary 

或者说,这将是我最喜欢的方式。 。 。

select e.FIRST_NAME, e.SALARY, e.CITY 
from (select e.*, 
      avg(salary) over (partition by city) as avgSalary 
     employee e 
    ) e 
where e.salary > e.avgSalary 
+0

连接不一定代替了共同相关的子查询。 – 2013-02-14 13:38:25

+0

@a_horse_with_no_name。 。 。连接和分组可以替换许多相关的子查询。并非全部,但大部分是你在实践中看到的。 – 2013-02-14 13:45:42

+0

好兄弟第一个工作 - 其他2似乎很难:D tyvm – user2072161 2013-02-14 13:50:44