2013-10-15 41 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

相关问题