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

Какой будет оператор SQL вставки для объединения данных из двух таблиц. Например, у меня есть таблица events_source_1 (столбцы: event_type_id, event_date) и таблица events_source_2 (те же столбцы) и таблица events_target (столбцы: event_type_id, past_event_date nullalbe, future_event_date nullable).

Events_source_1 имеет прошлые события, Events_source_2 имеет будущие события, а результирующая events_target будет содержать прошлые и будущие события в одной строке для одного и того же event_type_id. Если нет past_events, а future_events, то past_event_date не будет установлен, и будет только future_event_date, и наоборот тоже верно.

Заранее большое спасибо за помощь в решении этой проблемы.

Ответы [ 3 ]

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

Роман, вам нужно выполнить полное внешнее объединение для вашего выбора, чтобы для любого данного идентификатора типа события (и я предполагаю, что у вас будет 0 или 1 строка в ваших прошлых и будущих таблицах для любого конкретного типа события id), вы выведете одну строку и соответствующие нулевые и ненулевые даты.

Первый ответ не объединит даты из двух источников в одну строку, как я и просил.

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

Пример:

insert into event_target (event_type_id, past_event_date, future_event_date)<br> select nvl(p.event_type_id, f.event_type_id), p.event_date, f.event_date<br> from<br> events_source_1 p full outer join<br> events_source_2 f on p.event_type_id = f.event_type_id<br>

Обратите внимание, что функция nvl предназначена для Oracle и будет использовать первый ненулевой объект, который он видит. ISNULL может использоваться для SQL Server.

2 голосов
/ 03 июня 2010
INSERT INTO events_target
(
SELECT event_type_id, 
       NULL as past_event_date, 
       event_date as future_event_date 
  FROM Events_source_2
UNION
SELECT event_type_id, 
       event_date as past_event_date, 
       NULL as future_event_date 
  FROM Events_source_1
)

Пока event_type_id уникален для Events_source_1 и Events_source_2

1 голос
/ 03 июня 2010

Может быть что-то вроде этого: (Не уверен на 100% в синтаксисе)

insert into event_target (event_type_id, past_event_date, future_event_date)
select
    p.event_type_id as event_type_id,
    p.event_date as past_event_date,
    f.event_date as future_event_date
from events_source_1 p
inner join events_source_2 f on p.event_type_id = f.event_type_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...