SQL链接5表

时间:2011-07-28 21:04:54

标签: mysql sql join

还有更多,但有3张桌子......

employees  
employee_id  

licenses  
license_id  
employee_id  


companies  
company_id  
employee_id  

SELECT  * FROM employees  
LEFT JOIN licenses  
ON employees.employee_id = licenses.employee_id   
LEFT JOIN companies  
ON employees.employee_id = companies.employee_id  
GROUP BY employees.employee_id  

我只能得到它所以许可证OR公司返回一个值而另一个返回NULL。我怎样才能得到它以便两个表返回值?看起来很简单,但在这种情况下不起作用,我无法弄清楚为什么......

编辑:这是一些更多的信息 并非每个员工都有执照 并非每个员工都有公司。

想要返回employee_id license_id (if exists, else NULL) company_id (if exists, else NULL)

以员工同时拥有license_id和company_id的情况为例。通过删除其中一个JOIN子句,可以返回相应的值。但是,当两者合并时,只返回company_id,license_id返回NULL。

很奇怪,对吗?有什么想法或需要更多信息吗?

DATA:
EMPLOYEE_ID
1
2
3

employee_id license_id 1 1
2 1
3 2

employee_id company_id 1 1
2 1
3 2

为了浪费时间而烦恼

表模式搞砸了,多余了。这是一个继承的架构,我只考虑SQL,而不是底层结构。数据库需要重组。

3 个答案:

答案 0 :(得分:1)

如果不查看表格中的数据,这很难回答。所以我会假设,每个表中都有一些行都有一个相同的Employee_ID,因此连接起作用。在测试时我建议选择一个Employee_id来处理,只是为了在测试时简化输出。

根据我的假设,我将您的查询切换到内部联接,这只会显示在Employee_id上​​匹配的行。我也用过“别名”。我在每个表指针后放置的单个字母可以节省大量的输入。

SELECT *
FROM  employees e
INNER JOIN licenses l
    ON e.employee_id = l.employee_id
INNER JOIN companies 
    ON e.employee_id = c.employee_id
GROUP BY   employee_id

如果您是SQL连接的新手,this article也可能会有所帮助。祝你好运!

答案 1 :(得分:0)

这是我最喜欢的关于这个主题的文章。

http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx

尝试

FULL OUTER JOIN

答案 2 :(得分:0)

有很多不同的JOIN类型。我的建议是做一些关于它们的阅读来弄明白。您可以使用FULL OUTER JOIN

SELECT  * 
FROM employees  
FULL OUTER JOIN licenses  
    ON employees.employee_id = licenses.employee_id   
FULL OUTER JOIN companies  
    ON employees.employee_id = companies.employee_id  
GROUP BY employee_id  

如果没有看到任何数据,很难准确确定您想要的内容。但是这里有一个方便的SQL连接的可视化解释。我保留它的书签,以便我需要一些帮助。

http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html