2013-05-30 2 views
0

я получил две таблицы:Выбор существующих и отсутствующих записей в соответствии с другой таблицей

LANGUAGES 
    LANGUAGE_ID number(4), 
    LANG_NAME varchar2(30) 

LABELS 
    LANGUAGE_ID number(4), 
    TEXT_ID  varchar2(20), 
    LABEL_TEXT varchar2(100) 

Со следующими записями:

LANGUAGES: 
    LANGUAGE_ID | LANG_NAME 
    ----------------------- 
      1 | german 
      2 | english 
      3 | spanish 
      4 | italian 

LABELS: 
    LANGUAGE_ID | TEXT_ID | LABEL_TEXT 
    ----------------------------------- 
      1 | A  | Lorem ipsum 
      2 | A  | Lorem ipsum 
      1 | B  | Lorem ipsum 
      2 | B  | Lorem ipsum 
      3 | B  | Lorem ipsum 

Моя цель теперь будет выбирать все ярлыки, и для всех языки, на которых метка еще не введена, пустая запись. Результат должен быть таким:

LANGUAGE_ID | TEXT_ID | LABEL_TEXT 
---------------------------------- 
      1 | A  | Lorem ipsum 
      2 | A  | Lorem ipsum 
      3 | A  | 
      4 | A  | 
      1 | B  | Lorem ipsum 
      2 | B  | Lorem ipsum 
      3 | B  | Lorem ipsum 
      4 | B  | 

Как достичь этого с помощью хорошо выполняющегося оператора с использованием Oracle SQL?

спасибо!

ответ

2

Попробуйте

SELECT a.language_id, a.text_id, l.label_text 
    FROM 
(
    SELECT language_id, text_id 
    FROM languages CROSS JOIN 
(
    SELECT DISTINCT text_id FROM labels 
) q) a LEFT JOIN labels l 
    ON a.language_id = l.language_id 
    AND a.text_id = l.text_id 
ORDER BY a.text_id, a.language_id 

Выход:

| LANGUAGE_ID | TEXT_ID | LABEL_TEXT | 
---------------------------------------- 
|   1 |  A | Lorem ipsum | 
|   2 |  A | Lorem ipsum | 
|   3 |  A |  (null) | 
|   4 |  A |  (null) | 
|   1 |  B | Lorem ipsum | 
|   2 |  B | Lorem ipsum | 
|   3 |  B | Lorem ipsumh | 
|   4 |  B |  (null) | 

Вот SQLFiddle демо

+0

Это выглядит как хорошее решение, но на 9 языков и около 80'000 этикеток, он получает массово imperformant. Есть ли способ оптимизировать это? –

0

это то, что вы хотите, вы хотите, я думаю.

select a.language_id,b.text_id,b.label_text 
from languages a left join labels b 
on a.language_id=b.language_id 
+0

Это не даст результатов для несуществующих комбинаций 'language_id, text_id' – peterm

Смежные вопросы