我有4個表:如果else語句的MySQL
- 鎮
- 部
- 地區
- 國家
一個department
有一個外鍵region
和region
到Country
A town
有3個外鍵給其他表,但其中只有一個應該填充,其他必須爲空。 這是因爲您可以通過以下外鍵到達城鎮的Country
及其departement
或region
。
現在我想做一個SQL查詢,返回我所有的城鎮與他們的部門,地區,國家(如果設置)。 而問題是,我不能根據哪個城鎮的FK設置不同的連接。
如何獲得這項工作?
我有4個表:如果else語句的MySQL
一個department
有一個外鍵region
和region
到Country
A town
有3個外鍵給其他表,但其中只有一個應該填充,其他必須爲空。 這是因爲您可以通過以下外鍵到達城鎮的Country
及其departement
或region
。
現在我想做一個SQL查詢,返回我所有的城鎮與他們的部門,地區,國家(如果設置)。 而問題是,我不能根據哪個城鎮的FK設置不同的連接。
如何獲得這項工作?
如何:
SELECT …
FROM Town
LEFT JOIN Department ON Department.id = Town.department
LEFT JOIN Region ON Region.id = COALESCE(Town.region, Department.region)
LEFT JOIN Country ON Country.id = COALESCE(Town.country, Region.country)
COALESCE
需要從它的參數的第一個非NULL
值。所以在這種情況下,來自Town
的值會覆蓋其他設置。正如你聲明一個有區域參考的城鎮不會有部門參考,只有其中一個應該不是NULL
,所以如果你的數據如你所說,順序無關緊要。 LEFT JOIN
確保您爲沒有匹配的表獲得NULL
值。如果您需要的國家/地區只有它的ID,則可以省略最後的加入,並將COALESCE
包含在您選擇的值中。
這是查詢以顯示值。
select town.*,Department.*,Region.*,Country.* from town,Department,Region,Country where town.Dept_Id = Department.Dept and town.Region_Id = Region.Region_Id and town.Country_Id = Country.Countr_Id and Department.Region_Id = Region.Region_Id and Region.Country_Id = Country.Country_Id
取而代之,您可以使用左連接查詢。此查詢將花費更多的執行時間。左連接查詢
select * from town left join Department ON Department.id = Town.department left join Region ON Region.id = coalesce (Town.region, Department.region) left join Country ON Country.id = coalesce (Town.country, Region.country)
您可以在表之間使用'LEFT JOIN';如果你不熟悉這個語法,Jeff Atwood在這裏有一個很好的介紹:http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html – dash
你能在[SQL Fiddle](http://www.sqlfiddle.com/)上共享您的數據模型?這使得更容易理解你的問題。 – Kai
我試過使用'CASE',但它不能用於使不同的連接基於結果,它只返回一個值。數據模型比我的例子更復雜,事實上,我也必須提取部門,地區和國家的翻譯。(我正在製作模型) – Leto