Избегайте присоединения к одной и той же таблице несколько раз

0

Мне нужна помощь во избежание присоединения к одной и той же таблице несколько раз. Вот мой пример запроса.

Таблица 1 имеет 3 столбца ABC_ID, DEF_ID, XYZ_ID и связана с таблицей 2 в столбце идентификатора. 3 значения столбца в table1 могут быть нулевыми, и если значения присутствуют, тогда мне нужно вернуть соответствующее значение из таблицы 2, используя разные имена столбцов, как в операторе select.

Поскольку я использую левое соединение, я в итоге трижды присоединился к таблице 2 с таблицей 1 для каждого типа, если в столбце идентификатора много проблем с производительностью. Как я могу написать это по-другому, чтобы избежать объединения несколько раз. Вот пример данных. Любая помощь приветствуется

    select 
          (
          CASE
            WHEN ( table2.ID = table1.ABC_ID)
            THEN table2.ID_VAL
            ELSE 'TEST1'
          END ) AS "TEST1",
          (
          CASE
            WHEN (table2a.ID = table1.DEF_ID)
            THEN table2a.ID_VAL
            ELSE 'TEST2'
          END ) AS "TEST2",
          (
          CASE
            WHEN (table2b.ID = table1.XYZ_ID)
            THEN table2b.ID_VAL
            ELSE 'TEST3'
          END ) AS "TEST3"
    from table1 table1 
    left join table2 table2 on   (table2.ID=table1.ABC_ID)
    left join table2 table2a on   ( table2a.id=table1.DEF_ID)
    left join table2 table2b on   ( table2b.id=table1.XYZ_ID)
    where table1.Id_NUM='1'

Таблица 1

    Id_NUM  ABC_ID     DEF_ID    XYZ_ID
    1       12345      456789    32145
    2       null       456789    32145
    3       12345      null      null

Таблица 2

    ID         ID_VAL
    12345      abcded
    456789     kjwsddk
    321456     wedfgfv

ВЫХОД

    TEST1         TEST2       TEST3
    12345         456789      32145
  • 0
    Какую базу данных вы используете? Вы пометили это с помощью MySQL и нескольких версий Oracle ...
  • 0
    Спасибо за быстрый ответ. Мы используем оракул 12 г
Показать ещё 2 комментария
Теги:
oracle11g
oracle10g

1 ответ

0

Ваше join в порядке, но запрос может быть упрощен:

select coalesce(t2a.ID_VAL, 'TEST1') as test1,
       coalesce(t2d.ID_VAL, 'TEST2') as test2,
       coalesce(t2x.ID_VAL, 'TEST3') as test3
from table1 t1 left join
     table2 t2a
     on t2a.ID = t1.ABC_ID left join
     table2 t2d
     on t2d.id = t1.DEF_ID left join
     table2 t2x
     on t2x.id = t1.XYZ_ID
where t1.Id_NUM = 1;

Заметки:

  • Псевдонимы таблицы должны быть значимыми. В этом случае псевдонимы включают сокращения для столбца, используемого для объединения.
  • Предположительно, id_num является числом, поэтому не используйте одинарные кавычки для значения.
  • Нет причин избегать имен столбцов. Двойные кавычки просто добавляют беспорядок запроса.
  • Выражения case могут быть заменены на coalesce(), что проще (это не совсем то же самое, если id_val может быть NULL, но я предполагаю, что этого не происходит).

Нет причин избегать трехкратного присоединения к столу. Это то, чего требует ваша модель данных, потому что у вас есть три отдельные ссылки на внешние ключи.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню