#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;
Спасибо.