从多个表中返回空结果

时间:2012-12-21 21:10:54

标签: sql sql-server-2008

也许为什么我找不到解决方案是因为我不知道我到底在想什么!希望我能解释得足以得到答案。我有3个表(1个视图和2个表)。视图包含了我需要的所有细节,我们称之为用户表。表2和表2 3包含用户的最后一次登录(2个单独的系统)。我希望结果集在视图中显示每个用户,并使用表2和表2中的每一个进行最后一次登录。我正在匹配员工ID。我遇到的问题是表2和表2 3没有列出所有员工ID,因为他们从未登录过。因此,如果我内部连接表1& 2结果集不会显示视图中的所有用户,只显示匹配的用户。但是,我需要返回视图中的所有用户,如果用户从未登录(员工ID不在表2中),则将其留空或任何其他文本。

4 个答案:

答案 0 :(得分:1)

不要使用INNER联接。请改为使用OUTER加入

例如

表和列名称是虚构的......

SELECT 
  u.*, t1.logindate, t2.logindate
FROM 
  usertable u
LEFT OUTER JOIN table1 t1 ON u.id = t1.uid
LEFT OUTER JOIN table2 t2 ON u.id = t2.uid

引用documentation

  仅当两个表中至少有一行符合连接条件时,

内部联接 才会返回行。 内部联接消除了与另一个表中的行不匹配的行。
  但是, 外部联接 会返回FROM子句中提到的至少一个表或视图中的所有行,只要这些行符合任何WHERE或HAVING搜索条件。
  从左外部联接引用的左表中检索所有行,右外部联接中引用右表中的所有行。两个表中的所有行都以完整的外部联接返回。

答案 1 :(得分:0)

您要找的是left outer join.

这样的事情:

select u.*, s1.*, System2Login.*
from users u
  left outer join System1Login s1 on u.EmployeeID = s1.EmployeeID
  left outer join System2Login s2 on u.EmployeeID = s2.EmployeeID

应返回users表中的所有行,以及来自system1和system2的数据(如果可用)。

答案 2 :(得分:0)

SELECT <whatever columns you need>
FROM Table1 t1
LEFT OUTER JOIN Table2 t2
ON t1.employeeID = t2.employeeID
LEFT OUTER JOIN Table3 t3
ON t1.employeeID = t3.employeeID

答案 3 :(得分:0)

您正在描述“外部联接”的作用。使用LEFT OUTER JOIN(或RIGHT)代替INNER JOIN,即使第二个表中没有匹配项,也会显示第一个表的结果。

请阅读此http://en.wikipedia.org/wiki/Join_(SQL)#Outer_joins