Порядок по столбцу в дочерней таблице без извлечения данных из дочерней таблицы

#sql #oracle

#sql #Oracle

Вопрос:

У меня есть курсор, в котором я извлекаю данные для выполнения цикла FOR . В операторе выбора курсора я хочу упорядочить по столбцу, который находится в дочерней таблице, однако я не хочу извлекать данные из дочерней таблицы.

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

Пример моего сценария.

 CURSOR get_items_cursor_(rev_code_ IN VARCHAR2) IS
      SELECT *
      FROM   items_table
      WHERE  code = rev_code_ ;
  

Выше приведен простой курсор, который используется в моем цикле FOR.

введите описание изображения здесь

В таблице выше приведены примеры данных из items_table

Я хочу упорядочить эти данные из столбца is_original из дочерней таблицы part_items_table

Образец данных из дочерней таблицы

На приведенном выше изображении показаны данные из дочерней таблицы.

В курсоре выше я хочу объединить данные, используя столбец item_id, и сначала упорядочить по is_original TRUE . Однако я не хочу извлекать данные из дочерней таблицы в КУРСОР.

Я попробовал следующее

 SELECT * FROM 
item_table item
INNER JOIN item_part_table item_part ON item.item_id =item_part.item_id
ORDER BY item_part.is_original DESC
  

Приведенная выше инструкция select также отображает данные из дочерней таблицы. Логически говоря, соединение должно отображать данные из дочерней таблицы, но в моем сценарии я просто хочу отсортировать приведенную выше таблицу, используя столбец дочерних таблиц.

Любая помощь будет высоко оценена.

Спасибо

Комментарии:

1. SELECT item.* FROM ...

2. Возможен ли сценарий с повторяющимся ITEM_ID в ITEM_PART_TABLE, где одно значение IS_ORIGINAL = TRUE, а другое значение где IS_ORIGINAL = FALSE ? Если да — какое значение ITEM_TABLE вы ожидаете увидеть?

3. Выберите только нужные вам столбцы. Это всегда верно при использовании курсора, хотя сомнительно, действительно ли вам нужен курсор для логики, которую вы хотите реализовать.

4. @gogocho В item_part_table может быть повторяющийся item_id с одним is_original true, а другим false . Я хочу отобразить оба, но сначала я хочу выбрать запись с true .

5. @HarryManoharan — Итак, если у вас есть два значения для IS_ORIGINAL в PART_ITEMS_TABLE для ITEM_ID, вы хотите отобразить одно и то же значение для ITEM_ID, REV_CODE, ASSM_CODE, SLOT_CODE, ITEM_CODE из ITEM_TABLE дважды в вашем результате? Но упорядоченный по какому-то столбцу в дочерней таблице. Если у нас есть три раза ITEM_ID в PART_ITEMS_TABLE? Ожидается один и тот же результат три раза?

Ответ №1:

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

итак, я просто выбираю только столбцы item_table, единственная проблема в том, что у вас будет дубликат, и вы не сможете использовать distinct из-за порядка, которого нет в списке выбора, и именно поэтому он выдает ошибку

 SELECT DISTINCT item.* 
FROM 
   item_table item
INNER JOIN item_part_table item_part 
   ON item.item_id =item_part.item_id
ORDER BY 
   item_part.is_original DESC
  

Комментарии:

1. Я получаю сообщение об ошибке «ORA-01791: не выбранное выражение» при выполнении вашего вышеуказанного запроса.

Ответ №2:

Вы можете удалить * из предложения select и использовать item.* and item_part.is_original следующим образом:

 SELECT item.*, item_part.is_original FROM 
item_table item
INNER JOIN item_part_table item_part ON item.item_id =item_part.item_id
ORDER BY item_part.is_original DESC
  

Комментарии:

1. Но этот способ также выбирает записи из item_part_table, которые мне не нужны.

Ответ №3:

Основываясь на ваших комментариях, пожалуйста, попробуйте этот фрагмент кода:

 select item_id, rev_code, assm_code,slot_code, item_code
from
    (
        select
            c.*,
            row_number() over (partition by c.item_id order by p.is_original desc) as r_num,
            decode(p.is_original, 'TRUE', 1, 2) as ord_num
        from
            item_table c join part_items p on (p.item_id = c.item_id)
    )
where r_num = 1
order by ord_num;
  

Спасибо.