【问题标题】:SQL: find all rows which have referenced rows that all meet certain conditionsSQL:查找所有引用的行都满足特定条件的行
【发布时间】:2015-03-19 22:52:55
【问题描述】:

两张桌子。一对多。如何找到所有员工都在 IT 部门工作且年薪超过 150000 美元的所有公司?

[COMPANIES]

|----|--------------| 
| id | company_name |
|----|--------------|
| 1  | Google       |
| 2  | Apple        |
|----|--------------| 

[EMPLOYEES]

|----|------------|------|------------|--------|
| id | company_id | name | department | salary |
|----|------------|------|------------|--------|
| 1  | 1          | John | IT         | 200000 |
| 2  | 1          | Bob  | IT         | 200000 |
| 3  | 2          | Rick | Design     | 100000 |
| 4  | 2          | Bill | Design     | 100000 |
|----|------------|------|------------|--------|

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:

    你可以使用EXISTS + NOT EXISTS:

    SELECT c.*
    FROM COMPANIES c
    WHERE EXISTS
    (
        SELECT 1 FROM EMPLOYEES e
        WHERE e.company_id = c.id
         AND  e.salary > 150000 
         AND  e.department = 'IT'
    )
    AND NOT EXISTS
    (
       SELECT 1 FROM EMPLOYEES e
       WHERE e.company_id = c.id
         AND  (e.salary <= 150000 OR  e.department <> 'IT')
    )
    

    Demo

    【讨论】:

      【解决方案2】:

      我认为你可以使用having 子句得到你想要的:

      select company_id
      from employees
      group by company_id
      having min(department) = max(department) and
             min(department) = 'IT' and
             min(salary) >= 150000;
      

      如果你想要公司名称,你可以加入:

      select c.id, c.company_name
      from companies c join
           employees e
           on c.id = e.company_id
      group by c.id, c.company_name
      having min(department) = max(department) and
             min(department) = 'IT' and
             min(salary) >= 150000;
      

      【讨论】:

      • @CL。 . . .谢谢。
      猜你喜欢
      • 2014-02-18
      • 2018-07-27
      • 2021-02-01
      • 2013-10-19
      • 2019-11-13
      • 2011-05-12
      • 2021-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多