2013-10-15 48 views
0

我被存在和不存在的關鍵字卡住。如果b條件不存在,則使用條件a進行Oracle SQL選擇

我有一個表(Oracle門戶表),其中有總結,以下結構:

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

我需要一個選擇總是選擇每個ID兩行,即使A F行或NL行不存在。然後,該行應在列的語言不存在的語言,但與現有行的標題(用語言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而不是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

相關問題