2012-11-16 378 views
1

我有4個表:如果else語句的MySQL

  • 地區
  • 國家

一個department有一個外鍵regionregionCountry

A town有3個外鍵給其他表,但其中只有一個應該填充,其他必須爲空。 這是因爲您可以通過以下外鍵到達城鎮的Country及其departementregion

現在我想做一個SQL查詢,返回我所有的城鎮與他們的部門,地區,國家(如果設置)。 而問題是,我不能根據哪個城鎮的FK設置不同的連接。

如何獲得這項工作?

+1

您可以在表之間使用'LEFT JOIN';如果你不熟悉這個語法,Jeff Atwood在這裏有一個很好的介紹:http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html – dash

+0

你能在[SQL Fiddle](http://www.sqlfiddle.com/)上共享您的數據模型?這使得更容易理解你的問題。 – Kai

+0

我試過使用'CASE',但它不能用於使不同的連接基於結果,它只返回一個值。數據模型比我的例子更復雜,事實上,我也必須提取部門,地區和國家的翻譯。(我正在製作模型) – Leto

回答

3

如何:

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包含在您選擇的值中。

0

這是查詢以顯示值。

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)