使用维恩图解释多个连接的方法说明

3

http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.htmlhttps://web.archive.org/web/20120621231245/http://www.khankennels.com/blog/index.php/archives/2007/04/20/getting-joins/对于使用Venn图解释关联查询的基础知识非常有帮助。但我想知道如何将这种思维应用到具有多个连接的查询中。

假设我有3个表:

员工

EmployeeID
FullName
EmployeeTypeID

员工类型(全职、兼职等)

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

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

2
不想太挑剔,但那是欧拉图,不是维恩图。 - Jesse
Venn图并不显示连接。表是行的集合而不是行的集合。第一个链接博客的作者在评论中否认了它。SQL的特殊情况可能对应于Venn图,但请注意这样的图表从未带有这样的限制和图例。为什么你甚至接受没有图例的图表?--反问。自然连接的Venn图“在使用Venn图学习连接的基础知识方面非常有帮助”哦?圆圈和元素是什么?如果有重复的行或空值呢?它说了什么,为什么? - philipxy
2个回答

3
我认为把你的例子映射到这些类型的图表上并不是完全可能的,原因如下:
这里的图表是用来描述集合论中的交集和并集的。为了像图表中所示具有重叠部分,所有三个图表都需要包含相同类型的元素,但按照定义,如果我们处理三个包含不同类型的(行)对象的表,则不可能实现这一点。
如果所有三个表都使用相同的关键字连接,则您可以将此关键字的值标识为集合包含的元素,但由于在您的示例中不是这种情况,因此这种类型的图片不适用。
如果我们假设在您的示例中,两个连接都使用相同的关键字,则只有绿色区域才是正确的结果,因为第一个连接限制您只能在“员工”和“员工类型”的交集中进行选择,而第二个连接限制您选择全部“员工”,由于必须满足两个连接条件,因此您将得到上述两个部分的交集,即绿色区域。
希望这可以帮助您。

1

这不是准确的集合图表(无论是维恩图还是欧拉图)。没有任何实体既属于员工又属于员工类型。即使您的表模式表示某种表继承,所有实体仍将在基本表中。

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

Jeff 在其评论中否认了那篇博客。这种否认显示出更多的误解。 - philipxy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接