2016-07-14 3 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을 반환하는 복잡한 SELECT를 가지고 4. 그런 다음

나는 다음과 같은 정보를 반환해야합니다 :

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

편집 : 결과가 표시되는 방식을 변경하거나 충분히 명확한 한 다른 것을 변경하는 데는 신경 쓰지 않아도됩니다. IT는 가족 같은 아과의 결과를 반환 AS, 아래 이러한 시도가 작동하지 않을 것입니다, 그리고 그렇지 않은 :

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*/) 

편집 : 여기에

내가 지금까지 한 일이다 내가 필요로하는 서브 패밀리의 부모 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*/)를 수행하여 괴물 같은 선택을 반복하고 싶지 않아요. 내가 지나치게 복잡하게 모든 것을 나는 느낌 ... 여기


는 IT가 최종 QUERY, 계정에 허용 대답을 촬영하기 (경우 누군가에 궁금) IS

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 또는 cf2.parent_id IN (2,4/* 복잡한 선택 * /)이 작동하지 않습니다. , 나는 매우 길기 때문에 연령이 오래 걸리기 때문에 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

관련 문제