基于多个表的SELECT查询

时间:2014-01-23 14:40:24

标签: mysql sql

我们在 MySQL 数据库中有三个表 -

  1. 公司
  2. 员工
  3. 地址
  4. 公司有员工。员工有地址。 [注意他们可以有多个地址]

    请查看下面的图片,了解结构的一般概念

    DB Structure

    我们有两个条件 -

    1.获取员工中至少有一个地址列在地址表中的所有公司。

    示例查询结果应包含以下公司 -

    Microsoft,Google,IBM


    2.获取员工在地址表中没有列出地址的所有公司。

    示例查询结果应包含以下公司 -

    雅虎

    我们目前编写的此查询似乎适用于此特定条件 -

    SELECT
      company_id,
      companies.company_name,
    FROM companies
      LEFT OUTER JOIN employees    ON employees.company_id = companies.company_id
      LEFT OUTER JOIN addresses    ON address.employee_id = employees.employee_id AND address_id IS NOT NULL
    WHERE address_id IS  NULL GROUP BY companies.company_id;
    

    有没有办法在不使用存储过程的情况下使用单个查询将这些结果提取到数据库?它应该在结果集(0或1)中添加一列,具体取决于公司员工是否列出了地址。

3 个答案:

答案 0 :(得分:2)

1.获取员工中至少有一个地址列在地址表中的所有公司。

2.获取员工在地址表中没有列出地址的所有公司。

有没有办法在不使用存储过程的情况下使用单个查询来获取这些结果?

试试这个:

SELECT * FROM companies

更新回答:

Select c.[company_id],c.[company_name], CASE WHEN count(a.address_id)>0 THEN 1 ELSE 0 END as [flag] from Company c
left join Employee e on e.[company_id] = c.[company_id]
left join Address a on a.[employee_id] = e.[employee_id]
group by c.[ID],c.[company_name]

给我结果:

ID  NAME    FLAG
2   Google  1
3   IBM 1
1   Microsoft   1
4   Yahoo   0

sqlfiddle: http://sqlfiddle.com/#!6/4163a/3

更新:抱歉,对于MSSQL,sqlfiddle。这是mysql: http://sqlfiddle.com/#!2/18d09/1

答案 1 :(得分:2)

我只想在现有查询中添加另一列,并删除地址上的IS NULL测试。您将获得所有公司,以及一个列(标志),指示它是否没有存档地址。

SELECT
      company_id,
      companies.company_name,
      MAX( CASE WHEN address.address_id IS NULL then 1 else 0 end ) as NoAddressOnFile
   FROM 
      companies
         LEFT OUTER JOIN employees
            ON companies.company_id = employees.company_id
            LEFT OUTER JOIN addresses    
               ON employees.employee_id = address.employee_id
   GROUP BY
      companies.company_id;

答案 2 :(得分:0)

您可以使用“UNION”将两个或多个查询连接到单个查询中。

顺便说一下。根据您的条件,您实际上想要所有公司。