2013-10-15 5 views
0

존재하지 않는 키워드가 있습니다. 조건이 b 인 경우 조건 a로 선택하는 SQL

ID LANGUAGE CAPTION 
1  NL   DUTCH CAPTION 
1  F   FRENCH CAPTION 
2  NL   DUTCH CAPTION 
3  F   FRENCH CAPTION 

가 난 F 행 또는 NL 행이없는 경우에도 항상 ID 당 두 개의 행을 선택하는 선별이 필요합니다

나는 테이블이 (오라클 포탈 테이블), 요약, 다음과 같은 구조를 가지고 존재합니다. 그런 다음 행이 열 언어로 존재하지 않는 언어를 사용하지만 (언어 F 포함) 기존 행의 캡션

으로 선택해야합니다 그래서 쿼리의 출력은 다음과 같아야합니다

ID LANGUAGE CAPTION 
1  NL   DUTCH CAPTION 
1  F   FRENCH CAPTION 
2  NL   DUTCH CAPTION 
2  F   DUTCH CAPTION 
3  F   FRENCH CAPTION 
3  NL   FRENCH CAPTION 

이인가 가능한?

매우 호기심이 많고 이며 이미 큰 감사를드립니다!

ps : 나는 이와 비슷한 것을 가지고 있지만 그것이 내가 원하는 것만은 아니다.

SELECT id, language, display_name 
FROM portal.wwsbr_all_folders p 
WHERE caid = 55 
AND DISPLAY_IN_PARENT_FOLDER = 1 
AND ((upper(language) = 'NL' AND not exists (SELECT * FROM portal.wwsbr_all_folders p2 WHERE p.id = p2.id and language IN ('F'))) 
     OR 
     (upper(language) = 'F' AND not exists (SELECT * FROM portal.wwsbr_all_folders p2 WHERE p.id = p2.id and language IN ('NL'))) 
    ) 
AND parent_id = 4030963 
ORDER BY sub_folder_sequence 

편집 : 나는 다음과 같은

(SELECT id, CASE language WHEN 'nl' THEN 'f' ELSE 'f' END lang, display_name 
FROM portal.wwsbr_all_folders p 
WHERE caid = 55 
AND DISPLAY_IN_PARENT_FOLDER = 1 
AND ((language = 'f' and exists(SELECT * FROM portal.wwsbr_all_folders p2 WHERE p2.id = p.id AND language = 'f')) 
    OR (language = 'nl' and not exists(SELECT * FROM portal.wwsbr_all_folders p2 WHERE p2.id = p.id AND language = 'f'))) 
AND parent_id = 4656102) 
UNION ALL 
(
SELECT id, CASE language WHEN 'f' THEN 'nl' ELSE 'nl' END lang, display_name 
FROM portal.wwsbr_all_folders p 
WHERE caid = 55 
AND DISPLAY_IN_PARENT_FOLDER = 1 
AND ((language = 'nl' and exists(SELECT * FROM portal.wwsbr_all_folders p2 WHERE p2.id = p.id AND language = 'nl')) 
    OR (language = 'f' and not exists(SELECT * FROM portal.wwsbr_all_folders p2 WHERE p2.id = p.id AND language = 'nl'))) 
AND parent_id = 4656102) 

답변

1

두 가지 언어가 있습니까? 그렇다면 해결책을 시도해 볼 수 있습니다.

WITH 
    my_data AS 
    (   SELECT 1 AS id, 'NL' AS language, 'DUTCH CAPTION' AS caption FROM dual 
     UNION ALL SELECT 1 AS id, 'F' AS language, 'FRENCH CAPTION' AS caption FROM dual 
     UNION ALL SELECT 2 AS id, 'NL' AS language, 'DUTCH CAPTION' AS caption FROM dual 
     UNION ALL SELECT 3 AS id, 'F' AS language, 'FRENCH CAPTION' AS caption FROM dual) 
SELECT 
     id, language, caption 
    FROM my_data md 
UNION ALL 
SELECT 
     id, DECODE(language, 'NL', 'F', 'NL'), caption 
    FROM my_data md 
WHERE NOT EXISTS (SELECT 1 
        FROM my_data 
        WHERE id = md.id 
        AND language != md.language) 
ORDER BY id, language; 
+0

답변 주셔서 감사합니다, 나는 방금 올바른 결과를 반환 또 다른 해결책을 발견. 어떤 것이 더 낫다는 것 (옵티마이 저 및로드)을 알지 못합니다 ... '질문'에서 편집하십시오. – Verthosa

+0

@Verthosa 제 솔루션이 더 빠를 것 같고, 당신의 서브 쿼리가 더 많습니다. –

+0

tnx 많은 사람 !! – Verthosa

0

뭔가를해야만 이제 다음 쿼리 올바른 결과를 얻고있다.

ID가있는 추가 테이블이있는 경우 id_list의 istead를 사용하고 WITH 부분을 생략하십시오.

WITH id_list AS 
(SELECT DISTINCT id FROM portal_table) 
SELECT * 
FROM 
(
    -- FRENCH 
    SELECT 
     i.id as id 
    , 'F' as language 
    , NVL(f.CAPTION, NL.CAPTION) AS CAPTION 
    FROM 
     id_list i 
     LEFT OUTER JOIN portal_table f ON (f.id = i.id AND f.language = 'F') 
     LEFT OUTER JOIN portal_table nl ON (nl.id = i.id AND nl.language = 'NL') 
    UNION 
     -- DUTCH 
    SELECT 
     i.id as id 
    , 'NL' as language 
    , NVL(NL.CAPTION, F.CAPTION) AS CAPTION 
    FROM 
     id_list i 
     LEFT OUTER JOIN portal_table f ON (f.id = i.id AND f.language = 'F') 
     LEFT OUTER JOIN portal_table nl ON (nl.id = i.id AND nl.language = 'NL') 
) 
order by id 
; 
+0

테스트 해 보셨습니까? 한 가지는'JOIN' 키워드를 놓친 구문 오류가 있고 두 번째는 올바른 결과 집합을 반환하지 않는다는 것입니다. 일부 레코드는'CAPTION' 열에'NULL'을 가지고 있으며, 모두 나머지 레코드에는'FRENCH CAPTION'이 있습니다. –

+0

메모 주셔서 감사합니다, 나는 내 대답을 수정했습니다 – schurik