Как создать оператор SQL выбора, который будет производить «объединенный» набор данных из двух таблиц (СУБД Oracle)? - PullRequest
0 голосов
/ 03 июня 2010

Вот мой оригинальный вопрос: объединение двух наборов данных

К сожалению, я опустил некоторые грубости, которые я хотел бы уточнить здесь.

Итак, у меня есть две таблицы: events_source_1 и events_source_2. Я должен вывести набор данных из этих таблиц в результирующий набор данных (который я смог бы вставить в третью таблицу, но это не имеет значения).

events_source_1 содержит исторические данные о событиях, и я должен получить самое последнее событие (для этого я делаю следующее:

select event_type,b,c,max(event_date),null next_event_date
from events_source_1
group by event_type,b,c,event_date,null

events_source_2 содержит данные о будущих событиях, и я должен сделать следующее:

select event_type,b,c,null event_date, next_event_date
from events_source_2
where b>sysdate;

Как поместить оператор внешнего соединения, чтобы заполнить пустоту (т. Е. Когда тот же event_type, b, c найден из event_source_2, тогда next_event_date будет заполнен первой найденной датой

БОЛЬШОЙ ЦЕННОСТЬ ДЛЯ ВАШЕЙ ПОМОЩИ В РАСШИРЕНИИ.

Ответы [ 3 ]

2 голосов
/ 03 июня 2010

Надеюсь, я правильно понял ваш вопрос. Это должно вернуть самое последнее event_date из events_source_1 за event_type, b, c и добавить самое низкое event_date из event_source_2.

Select es1.event_type, es1.b, es1.c,
       Max(es1.event_date),
       Min(es2.event_date) As next_event_date
From events_source_1 es1
Left Join events_source_2 es2 On (     es2.event_type = es1.event_type
                                   And es2.b = es1.b
                                   And es2.c = es1.c
                                 )
Group By c1.event_type, c1.b, c1.c
1 голос
/ 08 июня 2010

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

Добавьте что-то вроде этого в начало запроса:

with past_source as (<br> select event_type, b, c, max(event_date)<br> from event_source_1<br> group by event_type, b, c, event_date<br> )

Затем вы можете использовать past_source, как если бы это была настоящая таблица, и продолжить выбор сразу после закрывающих скобок в показанном предложении with.

0 голосов
/ 07 июня 2010

В итоге я делаю двухэтапный процесс: 1-й шаг заполняет данные из таблицы событий 1, 2-й шаг СЛИВАЕТ данные между целью (набор данных из 1-го шага) и другим источником. Пожалуйста, прости меня, но мне пришлось скрыть имя таблицы и опустить некоторые столбцы в коде ниже по юридическим причинам. Вот SQL:

    INSERT INTO EVENTS_TARGET (VEHICLE_ID,EVENT_TYPE_ID,CLIENT_ID,EVENT_DATE,CREATED_DATE) 
select VEHICLE_ID, EVENT_TYPE_ID, DEALER_ID, 
max(EVENT_INITIATED_DATE) EVENT_DATE, sysdate CREATED_DATE
FROM events_source_1 
GROUP BY VEHICLE_ID, EVENT_TYPE_ID, DEALER_ID, sysdate;

Вот второй шаг:

    MERGE INTO EVENTS_TARGET tgt
USING (
  SELECT ee.VEHICLE_ID VEHICLE_ID, ee.POTENTIAL_EVENT_TYPE_ID POTENTIAL_EVENT_TYPE_ID, ee.CLIENT_ID CLIENT_ID,ee.POTENTIAL_EVENT_DATE POTENTIAL_EVENT_DATE FROM EVENTS_SOURCE_2 ee WHERE ee.POTENTIAL_EVENT_DATE>SYSDATE) src
ON (tgt.vehicle_id = src.VEHICLE_ID AND tgt.client_id=src.client_id AND tgt.EVENT_TYPE_ID=src.POTENTIAL_EVENT_TYPE_ID)
WHEN MATCHED THEN
 UPDATE SET tgt.NEXT_EVENT_DATE=src.POTENTIAL_EVENT_DATE
WHEN NOT MATCHED THEN
insert (tgt.VEHICLE_ID,tgt.EVENT_TYPE_ID,tgt.CLIENT_ID,tgt.NEXT_EVENT_DATE,tgt.CREATED_DATE) VALUES (src.VEHICLE_ID, src.POTENTIAL_EVENT_TYPE_ID, src.CLIENT_ID, src.POTENTIAL_EVENT_DATE, SYSDATE)
;
...