Могу ли я объединить два запроса в sql или pl / sql для создания новой таблицы или представления? - PullRequest
0 голосов
/ 14 марта 2019

У меня есть две таблицы.

Таблица первая: ЛИЦО

|-----------|-----------|-------------------------|
|     id    |   name    |    date_joined          |
|-----------|-----------|-------------------------|
|   10      |   Joe     |  03/25/2018             |
|-----------|-----------|-------------------------|
|   20      |   Sam     |  01/01/2017             |
|-----------|-----------|-------------------------|

Таблица 2: ДЕЯТЕЛЬНОСТЬ

|--------------|----------------|--------------|------------------|
| Activity_Id  | DESCRIPTION    |   PERSON_ID  |  DATE_STARTED    |
|--------------|----------------|--------------|------------------|
|  500         | RUNNING        |   10         |  05/25/2018      |
|--------------|----------------|--------------|------------------|
|  600         | BASEBALL       |   10         |  07/25/2018      |
|--------------|----------------|--------------|------------------|  

Существуют сотни строк для таблицы PERSON и тысячи строк для таблицы ACTIVITY. Некоторые объекты в таблицах PERSON отсутствуют в таблице ACTIVITY, в то время как некоторые объекты в таблице PERSON имеют несколько записей в таблице ACTIVITY.

Могу ли я создать представление, используя два запроса из этих двух таблиц, которые будут отображать person.id и activity.max (date_started)? и если person.id не имеет записей в таблице Activity, то person.date_joined перейдет в представление.

Или это должна быть процедура? У меня есть запросы, чтобы найти активность.max (date_started) и есть таблица, которую я создал (newTable), как таблица Person без столбца имени, но те же точные данные в столбцах Id и date_joined. Как бы я обновил его, чтобы иметь представление или таблицу с последней датой начала из таблицы активности и person_id. а если не просто показать person.date_joined

MERGE INTO newTable WITH (HOLDLOCK)AS R
 USING (SELECT MAX(T.date_started), T.person_id
   FROM activity T
   WHERE (T.EVENT_TYPE_KEY IN (249)
   ) AS T
ON R.id = T.person_id
WHEN MATCHED THEN 
update 
set R.date_joined = T.date_started

и оператор слияния не завершен и, возможно, неверный синтаксис или что-то в этом роде, потому что он выдает ошибку.

База данных Oracle. Разработчик pl / sql, который мне сказали, работал на сервере sql?

1 Ответ

0 голосов
/ 15 марта 2019

Слияние не выполняется, так как в T.person_id отсутствует предложение group by.

Вы можете получить данные из таблицы действий внутри подзапроса и оставить соединение с таблицей person, чтобы получить желаемый результат.

пример: -

MERGE INTO newTable WITH (HOLDLOCK)AS R
 USING (
    select p.id as id, ISNULL(act.date_started, p.date_joined) as date_started
    from 
     person p left outer join
      (SELECT MAX(T.date_started) date_started, T.person_id
       FROM activity T
      WHERE (T.EVENT_TYPE_KEY IN (249)
       group by T.person_id
      ) act on p.id = act.PERSON_ID
   ) AS T
ON (R.id = T.person_id)
WHEN MATCHED THEN 
update 
set R.date_joined = T.date_started
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...