2016-11-22 2 views
0

Яркое предупреждение: я новичок в использовании SQL. Я делаю это на сервере Oracle либо через AQT, либо с помощью SQL Developer.SQL UNION ALL включает только новые записи из таблицы «bottom»

Как я уже не в состоянии думать или искать свой путь к ответу, я ставлю себя в ваших умелых руках ...

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

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

С 4-го января, таблицы может выглядеть примерно так:

A____________________________   B_____________________________ 
entity date  type value   entity date  type value 
X  1.jan 1  1    X  1.jan 1  2 
X  1.jan 0  1    X  1.jan 0  2 
X  2.jan 1  1    X  2.jan 1  2 
Y  1.jan 1  1 (new entry)X  3.jan 1  1 
Y  3.jan 1  1    Y  1.jan 1  2 
             Y  3.jan 1  2 
          (new entry)Y  4.jan 1  1 

Я сделал попытку в какой-то код, который я надеюсь прояснить мою потребность:

WITH 
AA AS 
(SELECT entity, date, SUM(value) 
FROM table_A 
GROUP BY 
entity, 
date), 

BB AS 
(SELECT entity, date, SUM(value) 
FROM table_B 
WHERE date > ALL (SELECT date FROM AA) 
GROUP BY 
entity, 
date 
) 

SELECT * FROM (SELECT * FROM AA UNION ALL SELECT * FROM BB) 

Теперь, если WHERE date > ALL (SELECT date FROM AA) будет работать отдельно для каждой сущности, я думаю, имею то, что мне нужно.

То есть, для каждого объекта, я хочу, чтобы все элементы из A, и только новые записи из B.

Как видно из данных таблицы А часто отличается от B (значения часто исправленный) Я не думаю, что я может использовать что-то вроде: table A UNION ALL (table B MINUS table A)?

Благодаря

ответ

0

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

Основная идея о получении более новых строк из table_b использует условия в предложении where, что-то вроде этого:

select . . . 
from table_a a 
union all 
select . . . 
from table_b b 
where b.date > (select max(a.date) from a where a.entity = b.entity); 

Вы можете, конечно, запустить это на КТР, если те, что вы действительно хотите комбинировать.

+0

Агрегация по всем значениям для одного объекта за одну дату. Используя таблицу A, X имеет значение SUM (значение) = 2 на 1. jan. Подробнее: не выбрал ли max (a.date) из ... 'вернуть один max_date? Я хотел бы один для каждого объекта ... – Kjetil

+0

@Kjetil. , ,Как я уже сказал в ответ, просто запустите это, используя определенные вами CTE. –

+0

Я чувствую себя немного застенчивым, так как не знал, что max() может возвращать несколько значений. Большое спасибо за то, что вы поместились с noob. – Kjetil

0

Использование UNION вместо UNION ALL, он удалит дубликаты записей

SELECT * FROM (
        SELECT * 
        FROM AA 
        UNION 
        SELECT * 
        FROM BB ) 
+0

Проблема в этом, я думаю, состоит в том, что старые записи в A не идентичны старым в B (данные в A рассматриваются для ошибок и еще чего-то). Как СОЮЗ знает, что игнорировать изменения ..? – Kjetil

+0

@ Kjetil Если старые записи в B не такие же, как A, то мы должны рассматривать это как новую запись. Правильно? –

1

По сути вы ищете записи в ББ, которые не существуют в АА. Когда вы делаете date > ALL (SELECT date FROM AA), это не будет принимать во внимание субъект, о котором идет речь, и вы не получите правильные записи. Альтернатива - использовать JOIN и отфильтровывать все соответствующие записи с помощью AA.

Что-то вроде ниже.

WITH 
AA AS 
(SELECT entity, date, SUM(value) 
FROM table_A 
GROUP BY 
entity, 
date), 

BB AS 
(SELECT entity, date, SUM(value) 
FROM table_B 
LEFT OUTER JOIN AA 
    ON AA.entity = BB.entity 
    AND AA.DATE = BB.date 
WHERE AA.date == null 
GROUP BY 
entity, 
date 
) 

SELECT * FROM (SELECT * FROM AA UNION ALL SELECT * FROM BB) 
Смежные вопросы