當聯接表時,您所創建的聯接類型決定了出現在結果集中的行。您可以創建下列類型的聯接:
- 內部聯接 一個聯接,僅顯示在兩個聯接的表中匹配的行。(這是查詢設計器中的默認聯接類型。)例如,您可以聯接 titles 和 publishers 表,以創建一個結果集,顯示每本書名的出版商名稱。在一個內部聯接中,結果集中不包含沒有出版商信息的書名,也不包含沒有書名的出版商。 注意 當您創建一個內部聯接,因此不包括在結果集中時,包含 NULL 的列不與任何值匹配。Null 值不與其他的 null 值匹配。
- 外部聯接 一個聯接,包括那些即使它們在聯接表中沒有相關行的行。您可以創建一個外部聯接的三個變體來指定所包括的不匹配行:
- 左外部聯接 包括第一個命名表(“左”表,出現在 JOIN 子句的最左邊)中的所有行。在右表中的不匹配行不出現。例如,下面的 SQL 語句舉例說明了一個 titles 表和 publishers 表之間的左外部聯接包括所有的標題,即使是那些沒有出版商信息的標題: SELECT titles.title_id, titles.title, publishers.pub_nameFROM titles LEFT OUTER JOIN publishers ON titles.pub_id = publishers.pub_id
- 右外部聯接 包括第二個命名表(“右”表,出現在 JOIN 子句的最右邊)中的所有行。不包括左表中的不匹配行。例如,在 titles 和 publishers 表之間的右外部聯接包括所有的出版商,即使是那些在 titles 表中沒有書名的行。
- 完全外部聯接 包括所有聯接表中的所有行,不論它們是否匹配。例如,titles 和 publishers 之間的一個完全外部聯接顯示所有標題和所有出版商,即使是那些在另一個表中沒有匹配值的。
創建自聯接
您可以用一個表和它自己聯接,也就是說,創建一個自聯接。如果您想同一個表中查找與其他行有共同值的行。例如,您可以利用一個自聯接查找擁有同一個郵政編碼的兩個作者。
象其他聯接一樣,自聯接需要至少兩個表。不同的是,您并不是將另一個表添加到查詢,而是添加同一個表的第二個實例。這樣,您就可以把表的第一個實例中的一個列和在第二個實例中的同一個列進行比較,這樣就可以使您相互比較列中的值。表的每個實例必須唯一,因此查詢設計器給表的第二個實例指定一個別名。
例如,如果您創建一個自聯接來查找有同樣郵政編碼的所有作者,您將表的第一個實例中的 zip 列和第二個實例中的 zip 列進行比較。結果生成的聯接條件可能看上去像下面這樣:
FROM authors INNER JOIN authors authors1 ON authors.zip = authors1.zip創建一個自聯接通常需要多個聯接條件。主聯接條件是這個聯接所基于的那個條件。在作者郵政編碼的那個例子中,主聯接條件是基于在 zip 列查找一個確切的匹配。
然而,如果您的聯接僅基于這個條件,表中的每個行將在結果集中至少出現兩次。每個列和它自己匹配,導致了重復。此外,除聯接值的順序外,相同行的聯接結果是顛倒的。
要消除這些重復,您可以包含第二個聯接條件,以篩選掉重復的行。第二個聯接條件可能會用小于(<)運算符比較主鍵(在該示例中是 au id 列)。生成的聯接條件可能看上去像這樣:
FROM authors INNER JOIN authors authors1 ON authors.zip = authors1.zip AND authors.au_id < authors1.au_id當您創建一個自聯接時,查詢設計器通常自動創建第二個聯接條件,因為它是基于一個主鍵。然后您可以手動添加主聯接條件。
|