我们在 MySQL 数据库中有三个表 -
公司有员工。员工有地址。 [注意他们可以有多个地址]
请查看下面的图片,了解结构的一般概念
我们有两个条件 -
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)中添加一列,具体取决于公司员工是否列出了地址。
答案 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”将两个或多个查询连接到单个查询中。
顺便说一下。根据您的条件,您实际上想要所有公司。