http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html 和 http://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
我的问题是,使用相同类型的维恩图模式,如何在视觉上表示上述查询?这张照片准确吗?
答案 0 :(得分:3)
我认为由于以下原因,将您的示例映射到这些类型的图表上是不可能的:
这里的图表是用于描述集合论中的交叉点和联合的图表。为了具有如图中所示的重叠,所有三个图需要包含相同类型的元素,如果我们处理三个不同的表,其中每个包含不同类型的(行)对象,则根据定义这些元素是不可能的。
如果所有三个表都将在同一个键上连接,那么您可以将此键的值标识为集合包含的元素,但由于在您的示例中不是这种情况,因此这些图片不适用。
如果我们假设在您的示例中两个连接使用相同的键,那么只有绿色区域才是正确的结果,因为第一个连接将您限制为Employees
和Employee 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