Relational-Theory
連接代數,是否需要在一系列連接中重複一個表?
首先,我只是在詢問內部連接。而且,我認為通過連接表進行自連接或自反連接是特殊情況,這取決於數據的結構(例如城市 - 州 - 國家,孩子 - 父母 - 祖父母)。
但是對於其餘的連接表,沒有必要在任何給定的“鏈”中重複一個表?
(What I mean by "chain": __companies -- locations AS L1 -- N Joined Tables -- locations AS L2 SELECT people | __schools -- locations AS L3
因此,盡我所能認為 L1 和 L3 存在必要的重複,因為它們是未連接的搜尋。但是搜尋 L2 的任何條件都可以放在搜尋 L1 上。
這是普遍正確的嗎?這通常是真的嗎?
依賴於對同一個表的上下文(鏈)定址可能意味著不同的行集。所以你必須用兩個不同的別名來指向它們以避免歧義。
假設我們要建立客戶及其供應商的列表,包括他們居住的城市:
SELECT w.name AS customer, s.city AS c_city, z.name AS supplier, r.city AS s_city FROM customers AS w LEFT JOIN suppliers AS z ON z.id = w.supplier_id LEFT JOIN cities AS s ON s.id = w.city_id LEFT JOIN cities AS r ON r.id = z.city_id ORDER BY w.name ASC;
在這裡,同一張表被連接了兩次,因為每次連接都是在它自己的條件下執行的,並產生不同的城市名稱 - 一個用於客戶,一個用於供應商。如果不將同一張表連接兩次,就無法達到預期的效果。
附言
假設我們有遊客訪問過的城市列表:
------------------------------------- | ID | DATE | CITY_ID | PREVIOUS_ID | -------------------------------------
這
PREVIOUS_ID
是對同表中行的引用,意思是“城市遊客來自”。現在我們要建構包含最後四個訪問城市的路線到某個點:SELECT * FROM visited AS w JOIN cities AS z ON z.id = w.city_id LEFT JOIN visited AS r ON r.id = w.previous_id LEFT JOIN cities AS s ON s.id = r.city_id LEFT JOIN visited AS q ON q.id = r.previous_id LEFT JOIN cities AS d ON d.id = q.city_id LEFT JOIN visited AS x ON x.id = q.previous_id LEFT JOIN cities AS f ON f.id = x.city_id WHERE w.id = 12345; -- last position
如您所見,我們可以輕鬆地一次又一次地加入相同的表。