2012-07-30 18 views
2

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

+0

爲了不被以挑剔但是這是一個歐拉圖,而不是一個文氏圖。 – Jesse 2012-07-30 06:58:52

回答

3

我覺得這是不太可能你的例子映射到這些類型的原因如下圖表:這裏

的圖是用來描述集理論的十字路口和工會圖。爲了具有如圖所示的重疊的目的,所有三個圖都需要包含相同類型的元素,如果我們要處理三個不同的表(每個表包含不同類型的(行)對象。

如果所有三個表將在同一個鍵被連接,那麼你可以找出這個密鑰作爲集包含的元素的值,但由於這是不是在你的例子而言,這些樣的圖片是不適用的。

如果我們假設在你的例子兩者連接使用相同的密鑰,那麼只有綠地面積將是正確的結果,因爲第一連接限制你的EmployeesEmployee types,第二個路口的連接限制你的所有Employees,並且由於兩個連接條件都必須爲true,所以您會得到上述兩個綠色區域的交點。

希望這會有所幫助。

0

即不能準確集合圖(或者維恩或歐拉)。沒有實體是員工和員工類型的成員。即使您的表模式表示某種表繼承,但所有實體仍將位於基表中。

傑夫對編碼恐怖博客例如只適用於像實體即包含相同的實體兩個表 - 技術上違反正常化 - 或自聯接。

維恩圖能夠準確地描繪相同的場景:

-- 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