Как отображать только текущие и действительные данные из 2 таблиц в sql

#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»; опечатка исправлена, спасибо!