加入由维恩图解释不止一次加入

时间:2012-07-30 06:47:55

标签: sql sql-server join data-visualization venn-diagram

http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.htmlhttp://www.khankennels.com/blog/index.php/archives/2007/04/20/getting-joins/

在使用维恩图学习连接的基础知识方面非常有帮助。但我想知道如何将同样的想法应用于具有多个连接的查询。

假设我有3张桌子:

员工

EmployeeID
FullName
EmployeeTypeID

EmployeeTypes (全职,兼职等)

EmployeeTypeID
TypeName

InsuranceRecords

InsuranceRecordID
EmployeeID
HealthInsuranceNumber

现在,我希望我的最终结果集包含来自所有三个表的数据,格式如下:

EmployeeID | FullName | TypeName | HealthInsuranceNumber

使用从这两个网站学到的知识,我可以使用以下联接来获取所有员工,无论他们的保险信息是否存在:

SELECT 
    Employees.EmployeeID, FullName, TypeName, HealthInsuranceNumber 
FROM Employees
INNER JOIN EmployeeTypes ON Employees.EmployeeTypeID = EmployeeTypes.EmployeeTypeID
LEFT OUTER JOIN InsuranceRecords ON Employees.EmployeeID = InsuranceRecords.EmployeeID

我的问题是,使用相同类型的维恩图模式,如何在视觉上表示上述查询?这张照片准确吗?

multiple joins

2 个答案:

答案 0 :(得分:3)

我认为由于以下原因,将您的示例映射到这些类型的图表上是不可能的:

这里的图表是用于描述集合论中的交叉点和联合的图表。为了具有如图中所示的重叠,所有三个图需要包含相同类型的元素,如果我们处理三个不同的表,其中每个包含不同类型的(行)对象,则根据定义这些元素是不可能的。

如果所有三个表都将在同一个键上连接,那么您可以将此键的值标识为集合包含的元素,但由于在您的示例中不是这种情况,因此这些图片不适用。

如果我们假设在您的示例中两个连接使用相同的键,那么只有绿色区域才是正确的结果,因为第一个连接将您限制为EmployeesEmployee types的交集。第二个连接限制了Employees的全部,并且由于两个连接条件必须为真,因此您将得到两个上述部分的交集,这是绿色区域。

希望这有帮助。

答案 1 :(得分:0)

这不是一个准确的设定图(维恩或欧拉)。没有实体是Employees和Employee Types的成员。即使您的表模式表示某种表继承,所有实体仍将在基表中。

Jeff在Coding Horror博客上的示例仅适用于类似实体,即两个包含相同实体的表 - 技术上违反了规范化 - 或者是自我加入。

维恩图可以准确地描述如下情况:

-- The intersection lens
SELECT *
FROM table
WHERE condition1
    AND condition2

-- One of the lunes
SELECT *
FROM table
WHERE condition1
    AND NOT condition2

-- The union
SELECT *
FROM table
WHERE condition1
    OR condition2