Oracle запрос объединить две таблицы - PullRequest
0 голосов
/ 09 мая 2018

У меня есть таблица основного списка со следующим полем

Таблица A

  1. имя столбца (используется как имя столбца в значениях таблицы транзакций, таких как A, B, C)
  2. номер позиции (используется в качестве значения для этого столбца, A1, A2, A3, B1, B2, B3, C1, C2)
  3. item_description используется для отображения на экране

Таблица B

  1. Id
  2. A (имя из таблицы A и сохранение item_no в качестве значения)
  3. B
  4. C

теперь мне нужно получить описание предмета из таблицы A для соответствующего значения в таблице B.

Ответы [ 4 ]

0 голосов
/ 28 августа 2018

Используется Left Join для обработки запроса

0 голосов
/ 09 мая 2018

К сожалению, вы чрезмерно запутали свои примеры данных, что затрудняет понимание варианта использования, но я думаю, что у вас есть сочетание метаданных и реальных данных в таблице A. Что ужасно Я уверен, что у создателя этого проекта были причины, но результат всегда ужасные запросы.

Вот одно из решений, которое, возможно, менее ужасно, чем альтернативы.

select b.id
       , t_a.Itemdescription as a_Itemdescription
       , t_b.Itemdescription as b_Itemdescription
       , t_c.Itemdescription as c_Itemdescription
from b
     left outer join 
          ( select a.itemdescription
                   , a.item_no
            from a
            where a.columnname = 'A') t_a
           on t_a.item_no b.a
     left outer join 
          ( select a.itemdescription
                   , a.item_no
            from a
            where a.columnname = 'B') t_b
           on t_b.item_no b.b
     left outer join 
          ( select a.itemdescription
                   , a.item_no
            from a
            where a.columnname = 'C') t_c
           on t_c.item_no b.c

Если честно, я не уверен, что это ответ, который вы ищете. Если это не так, пожалуйста, отредактируйте свой вопрос , чтобы уточнить требование. Хорошей идеей будет предоставить пример данных в виде строк в таблицах и опубликовать пример выходных данных, полученных из входных данных.

0 голосов
/ 09 мая 2018

Я верю, что вы хотите:

select a.*, b.description
from a join
     b
     on (a.columnname = 'A' and a.itemno = b.A) or
        (a.columnname = 'B' and a.itemno = b.B) or
        (a.columnname = 'C' and a.itemno = b.C);

В Oracle вы можете сократить это до:

select . . .
from a join
     b
     on (a.columnname, a.itemno) in ( ('A', A), ('B', B), ('C', C));

Это может быть не особенно эффективно. Так что более эффективный метод:

select a.*, coalesce(ba.description, bb.description, bc.description)
from a left join
     b ba
     on a.columnname = 'A' and a.itemno = ba.A left join
     b bb
     on a.columnname = 'B' and a.itemno = bb.B left join
     b bc
     on a.columnname = 'C' and a.itemno = bc.C;
0 голосов
/ 09 мая 2018

Вы можете использовать простое СОЕДИНЕНИЕ:

SELECT b.item_description
  FROM TableA a JOIN TableB b on ( a.item_no = b.A );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...