Relational-Theory

連接代數,是否需要在一系列連接中重複一個表?

  • May 30, 2014

首先,我只是在詢問內部連接。而且,我認為通過連接表進行自連接或自反連接是特殊情況,這取決於數據的結構(例如城市 - 州 - 國家,孩子 - 父母 - 祖父母)。

但是對於其餘的連接表,沒有必要在任何給定的“鏈”中重複一個表?

(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

如您所見,我們可以輕鬆地一次又一次地加入相同的表。

引用自:https://dba.stackexchange.com/questions/66093