#sql #oracle
Вопрос:
У меня есть эти два стола:
Таблица imp_source:
Product class seq
5 5 1
5 3 2
5 16 3
8 1 1
8 4 2
Таблица imp_update:
Product class seq
5 6 4
8 1 6
8 4 2
8 23 3
9 3 1
Мне нужно написать запрос, чтобы получить этот результат:
Product class seq
5 5 1
5 3 2
5 16 3
5 6 4
8 1 6
8 4 2
8 23 3
9 3 1
- Все значения imp_update
- Значения imp_source, когда нет обновления для столбца seq комбинации продукт/класс.
Обновление 1:
Как вы можете видеть, строка в imp_source не является результатом
product class seq
8 1 1
Потому что в imp_update обновляется столбец seq комбинации продукт/класс:
product class seq
8 1 6
Комментарии:
1. что такое ваша СУБД ?
2. Моя база данных-Oracle
Ответ №1:
Здесь мы можем использовать подход объединения с помощью существующей логики:
SELECT s.Product, s.class, s.seq
FROM imp_source s
WHERE NOT EXISTS (SELECT 1 FROM imp_update u
WHERE u.Product = s.Product AND u.class = s.class)
UNION ALL
SELECT Product, class, seq
FROM imp_update
ORDER BY Product;
ДЕМОНСТРАЦИЯ
Ответ №2:
Выглядит как
SELECT product,class,MAX(seq)
FROM
(
SELECT x.*, 1 as x FROM imp_source x
UNION ALL
SELECT x.*, 2 as x FROM imp_update x
) z
GROUP BY product,class
ко мне
Если seq может идти как вниз, так и вверх, то, возможно:
SELECT DISTINCT
product,
class,
LAST_VALUE(seq) OVER(PARTITION BY product, class ORDER BY x ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as seq
FROM
(
SELECT x.*, 1 as x FROM imp_source x
UNION ALL
SELECT x.*, 2 as x FROM imp_update x
) z
Комментарии:
1. Я думаю, что с Максом это может быть неверно. Потому что обновление для Seq не всегда имеет большее значение.
2. Это не было сразу очевидно из данных вопроса. Я добавил альтернативную форму для этого случая
3. Я тоже попробовал с вашим и получил ошибку ORA-30484.
4. Я пропустил ключевое слово «OVER»; опечатка исправлена, спасибо!