3

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

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

假设我有 3 张桌子:

雇员

EmployeeID
FullName
EmployeeTypeID

EmployeeTypes(全职、兼职等)

EmployeeTypeID
TypeName

保险记录

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

我的问题是,使用同一种维恩图模式,上述查询将如何直观地表示?这张图准确吗?

多个连接

4

2 回答 2

3

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

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

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

如果我们确实假设在您的示例中,两个连接都使用相同的键,那么只有绿色区域是正确的结果,因为第一个连接将您限制为 and 的交集,EmployeesEmployee types第二个连接限制了您的全部,Employees因为两个连接条件一定是真的,你会得到上述两个部分的交集,即绿色区域。

希望这可以帮助。

于 2012-07-30T08:09:41.147 回答
0

这不是一个准确的集合图(Venn 或 Euler)。不存在同时属于雇员和雇员类型的实体。即使您的表模式表示某种表继承,所有实体仍将位于基表中。

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
于 2012-08-04T12:46:04.657 回答