創(chuàng)建自聯(lián)接
您可以用一個(gè)表和它自己聯(lián)接,也就是說,創(chuàng)建一個(gè)自聯(lián)接。如果您想同一個(gè)表中查找與其他行有共同值的行。例如,您可以利用一個(gè)自聯(lián)接查找擁有同一個(gè)郵政編碼的兩個(gè)作者。
象其他聯(lián)接一樣,自聯(lián)接需要至少兩個(gè)表。不同的是,您并不是將另一個(gè)表添加到查詢,而是添加同一個(gè)表的第二個(gè)實(shí)例。這樣,您就可以把表的第一個(gè)實(shí)例中的一個(gè)列和在第二個(gè)實(shí)例中的同一個(gè)列進(jìn)行比較,這樣就可以使您相互比較列中的值。表的每個(gè)實(shí)例必須唯一,因此查詢設(shè)計(jì)器給表的第二個(gè)實(shí)例指定一個(gè)別名。
例如,如果您創(chuàng)建一個(gè)自聯(lián)接來查找有同樣郵政編碼的所有作者,您將表的第一個(gè)實(shí)例中的 zip 列和第二個(gè)實(shí)例中的 zip 列進(jìn)行比較。結(jié)果生成的聯(lián)接條件可能看上去像下面這樣:
FROM authors INNER JOIN authors authors1 ON authors.zip = authors1.zip創(chuàng)建一個(gè)自聯(lián)接通常需要多個(gè)聯(lián)接條件。主聯(lián)接條件是這個(gè)聯(lián)接所基于的那個(gè)條件。在作者郵政編碼的那個(gè)例子中,主聯(lián)接條件是基于在 zip 列查找一個(gè)確切的匹配。
然而,如果您的聯(lián)接僅基于這個(gè)條件,表中的每個(gè)行將在結(jié)果集中至少出現(xiàn)兩次。每個(gè)列和它自己匹配,導(dǎo)致了重復(fù)。此外,除聯(lián)接值的順序外,相同行的聯(lián)接結(jié)果是顛倒的。
要消除這些重復(fù),您可以包含第二個(gè)聯(lián)接條件,以篩選掉重復(fù)的行。第二個(gè)聯(lián)接條件可能會用小于(<)運(yùn)算符比較主鍵(在該示例中是 au id 列)。生成的聯(lián)接條件可能看上去像這樣:
FROM authors INNER JOIN authors authors1 ON authors.zip = authors1.zip AND authors.au_id < authors1.au_id當(dāng)您創(chuàng)建一個(gè)自聯(lián)接時(shí),查詢設(shè)計(jì)器通常自動創(chuàng)建第二個(gè)聯(lián)接條件,因?yàn)樗腔谝粋(gè)主鍵。然后您可以手動添加主聯(lián)接條件。