2016-07-14 47 views
2

我不知道這是否是可能的,但我想我可以問返回值

我有家庭和亞科(family_table)的表:

family_id family_name  parent_id 
1   Family 1  null 
2   Family 2  null 
3   Subfamily 1.1 1 
4   Subfamily 1.2 1 
5   Family 3  null 
6   Subfamily 2.1 2 

然後,我有一個複雜的選擇返回一些family_id,如2,4

那我就需要返回以下信息:

principal_id family_name  subfamily_id subfamily_name 
2    Family 2  null   null 
1    Family 1  4    Subfamily 1.2 

編輯:我不介意改變如何顯示結果或改變別的東西,只要它足夠清楚。

這是我到目前爲止已經完成:

SELECT 
    CASE 
WHEN ft.parent_id IS NULL THEN 
    ft.family_id 
ELSE 
    ft.parent_id 
END AS principal_id, 
/*I was thinking something like this, but I don't know how to select another row value here, or if there would be another way 
CASE 
WHEN ft.parent_id IS NULL THEN 
    ft.family_name 
ELSE 
    *Family name from the parent* 
END AS family_name*/ 
FROM 
    family_table ft 
LEFT JOIN family_table ft2 ON ft2.parent_id = ft.family_id 
WHERE 
    ft.family_id IN (2,4/*complicated select*/) 

編輯:此嘗試BELOW是行不通的,因爲它把結果返回從亞科作爲一個家庭,它不加入我需要的子系列的父母ID。

或者,也許是這樣的:

SELECT 
    ft.family_id as principal_id, 
    ft.family_name as family_name, 
    ft2.family_id as subfamily_id, 
    ft2.family_name as subfamily_name 
FROM ft.family_table 
LEFT JOIN ft2.family_table ON ft2.parent_id = ft.family_id 
WHERE 
    /*ft.family_id OR ft2.parent_id*/ IN (2,4/*complicated select*/) 

我不想做ft.family_id IN (2,4/*complicated select*/) OR cf2.parent_id IN (2,4/*complicated select*/)重複滔天的選擇。 我有我過於複雜一切的感覺......


這最終的查詢,以接受的答案進去(萬一有人不知道)

SELECT 
    COALESCE (ft2.family_id, ft.family_id) AS family_id, 
    COALESCE (ft2.family_name, ft.family_name) AS family_name, 
    CASE WHEN ft.parent_id IS NOT NULL THEN ft.family_id 
    END AS subfamily_id, 
    CASE WHEN ft.parent_id IS NOT NULL THEN ft.family_name 
    END AS subfamily_name 
FROM family_table ft 
JOIN (/* complicated select */) AS t ON t.family_id IN (ft.family_id, ft.parent_id) 
LEFT JOIN family_table ft2 ON ft2.family_id = ft.parent_id 
+0

上次嘗試使用自連接的問題究竟是什麼?這正是我會用的。 – Shadow

+0

然後加入到複雜的選擇和使用簡單的'COPLICATED_SELECT_COLUMN IN(PARENT_ID,family_id)' – sagi

+0

@Shadow,問題是ft.family_id OR IN cf2.parent_id(2,4/*複雜SELECT * /)不工作,我不想在IN內重複選擇,因爲它非常長,而且需要很長時間。 – Tyrannogina

回答

2

嘗試加入到「複雜的選擇」,而不是使用IN(),這樣的事情:

SELECT 
..... 
FROM 
    family_table ft 
LEFT JOIN family_table ft2 ON ft2.parent_id = ft.family_id 
JOIN (/* complicated select here */) t 
ON(t.ID_OR_WHATEVER IN(ft.family_id,cf2.parent_id)) 

這會有同樣的效果。

+0

對不起,我的錯。這個或我的第二個提議都不會起作用,因爲它會從子系列中返回這些字段的信息... ft.family_id as principal_id, ft.family_name as family_name, – Tyrannogina

+0

對不起,我做錯了,它解決了它。 – Tyrannogina