2016-04-01 30 views
-2

我已經知道自連接是做什麼的。謝謝,我也讀過所有其他計算機化的運行堆棧溢出的描述,所以我知道這實際上並不是一個重複的問題,所以請不要給我表或連接列表。什麼是自我加入? (英語)

我所尋求爲什麼它會做(和請,不只是自我參照的員工經理例如)。

用簡單的英語,我想從自我加入中獲得什麼?

我的用法在大學課程中,來自關係代數角度。我已經做了幾年SQL,但教師喜歡在表格上進行自連接(重命名一個或多個字段後)。不是經常在SQL中完成的任何事情,所以我想知道他正在嘗試執行的操作是什麼,但他似乎非常熱衷於頻繁執行操作。

我認爲我會問這裏,許多人都問這個信息,但得到標記爲「已回答」,但所有的答案給操作描述不是「爲什麼能這樣做。」

回答

0

員工經理例子之所以如此普遍,是因爲它觸及了頭部。表上的自連接會查找行對,就像任何連接一樣,但兩行都來自同一個表。沒什麼特別的。

+0

感謝您的回覆,但我想你錯過了我要問的問題.. 員工經理的確精確地擊中了頭上的那個_particular_指甲;關係代數學上講,它是一種非常特殊的自我參照行爲。這就是爲什麼我特意從回覆中排除它。 從表面看來,自加入[自然,因爲我們正在談論關係代數,而不是SQL]是「沒什麼特別的」,所以_why_這麼做? 我在想: 查詢1 = TableX的⋈col1↦col1',col2↦col2'(TableX的) QUERY2 =σ= COL1 COL1'(σ= COL2 COL2' (查詢1)) 將「迴歸的完整列表tableX中的獨特線條「 – mist42nz

+0

哦,我想我並不是那麼特別。它始終發生,只要兩個相同類型的對象相關。銀行賬戶,保存和檢查?但你似乎錯過了加入幾乎總是跨欄。這不是因爲單列上的自加入會返回表 - 通常不會。它可以返回更多,更多的行。考慮在性別相同的人們的桌子上自我加入。它會返回每一對可能的男性和每一對可能的女性。定義明確但很少需要。 – MSalters

+0

對不起,您是否仍然加入關於員工經理的事情(「特定」)。 還是你回答我問的問題?如果你的答案很混亂。 到目前爲止,我的答案出現了,從我自己的研究到「爲了在所有相關項目上創建一個雙重條目」...... ....因此被設置爲刪除真正的重複項(在<>上選擇用於重命名的字段),以便在真實情況下保留它們是多行常見行的情況。這可以刪除單身,或預計顯示reoccurances。 – mist42nz

1

數據庫設計人員爲每個基表提供了一個謂詞(按列名參數化的句子模板)。

Parent(person, child) -- person PERSON is parent of person CHILD 
Likes(person, food) -- person PERSON likes food FOOD 

關係代數被設計成一個關係式(基表名或話務員呼叫)的值,認爲其謂語消費者作出真實的命題(聲明)的行。

-- person PERSON is parent of person CHILD 
Likes 

調用運算符NATURAL JOIN的表達式的謂詞是其輸入的謂詞的AND。

-- person PERSON is parent of person CHILD AND person PERSON likes food FOOD 
Parent NATURAL JOIN Likes 

同上,用於UNION & OR,MINUS & AND NOT,PROJECT 柱(一個或多個) & EXISTS其它列(多個),RESTRICT 條件 & AND 條件和列&的RENAME重命名參數。

/* 
EXISTS PERSON such that 
    person PERSON is parent of person CHILD AND person CHILD likes food FOOD 
*/ 
PROJECT child, food (Parent NATURAL JOIN (RENAME person:=child Likes)) 

因此,每個查詢表達式的值都包含使其謂詞變爲true語句的行。

假設我們將一個表的代數自連接定義爲通過零個或多個renamings從一個原始序列獲得的兩個表的NATURAL JOIN。根據以上我們對滿足謂詞AND的行進行NATURAL JOIN。 當我們希望滿足結果謂詞的行通過僅在參數/列中不同的謂詞表示時,就會產生自連接。

-- person PERSON likes food FOOD AND person CHILD likes food FOOD 
Likes NATURAL JOIN (RENAME person:=child Likes) 

沒有什麼特殊的地方在一個給定的應用其他比給定的查詢產生的自連接。


SQL SELECT DISTINCT語句可以通過代數運算符來描述。他們還計算查詢謂詞。首先FROM表列是通過在表格別名(相關名稱)&前加一個點來重新命名的。 (SQL NATURAL JOIN 不是點公共列。)新表是NATURAL JOINed。 ON和WHERE RESTRICT每個條件。然後SELECT DISTINCT子句重命名以從返回的列中刪除點& PROJECTS將不需要的虛線列刪除。

我們可以直接將SQL轉換爲謂詞:點輸入列重命名。 NATURAL/CROSS/INNER JOIN,ON &在哪裏給AND。每個無網點結果列都給出了AND,表示它等於它的虛線版本。最後刪除所有虛線列給EXISTS。

-- person PERSON likes food FOOD AND person CHILD likes food FOOD 
/* 
EXISTS P.*, C.* such that 
     P.PERSON = PERSON AND C.person = CHILD AND P.FOOD = FOOD 
    AND person P.CHILD likes food P.FOOD 
    AND person C.CHILD likes food C.FOOD 
    AND P.FOOD = C.FOOD 
*/ 
SELECT DISTINCT p.person AS person, c.person AS child, p.food AS food 
FROM Likes p INNER JOIN Likes c 
WHERE p.food = c.food 
    AND p.food = c.food 
    AND FOOD = c.food 

再說一遍:在SQL中,我們說在JOIN的多個表別名與同一個表值相關聯時,有一個自連接;在應用術語中,這意味着我們可以用一些參數/列中的謂詞不同來表示查詢的含義;對於這種情況,應用程序或表格的含義沒有什麼特別之處。


this re query semantics這恰好包括一個鏈接到this re self-join semantics in particular

+1

感謝您抽出時間。但下次請正確閱讀這個問題。在Web上有很多SQL甚至關係代數回覆,甚至在Stackoverflow上也有關於自加入機制的內容。你完全和完全沒有做到的是,給它一個英文的描述(即爲什麼你想要自己加入),這是問題的全部。 IIRC是通過重命名一個或多個字段;並且使用自連接來通過冗餘來匹配和刪除其他字段,自連接允許在表中搜索重複項,重疊項和多重性。 – mist42nz

+0

這個答案正確地解釋了「爲什麼你想要做一個自我連接」,關於商業/應用程序的推理:「當我們想要滿足只有[句子模板]參數不同的謂詞時」。你要求「避開SQL是一切想法和處理所涉及的邏輯」。邏輯*由定義*操縱謂詞。這個答案唯一與代數和SQL有關的是,它告訴你如何將關於商業/企業的英語陳述轉換爲他們。它說明了爲什麼以及何時出現連接和重新連接。 – philipxy

+0

您的評論並不反映我對所寫內容的理解。然後我談論業務邏輯,因爲問題是如何導致代數/ SQL內部連接,我還談論如何導致內部連接。我顯然不使用代數或SQL來進行業務邏輯,我使用英語。形式邏輯是英語的一個子集,工程(包括軟件工程)和科學(包括計算機科學)中的精確語言。您忽略了我使用「謂詞」(它將SQL的使用概括爲)*作爲使用名稱*的語句,沒有這種通信是不可能的。 – philipxy

相關問題