【问题标题】:Can I put two queries together in sql or pl/sql to create a new table or view?我可以将两个查询放在 sql 或 pl/sql 中以创建新表或视图吗?
【发布时间】:2019-08-05 21:15:26
【问题描述】:

我有两张桌子。

表一:PERSON

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

表二:活动

|--------------|----------------|--------------|------------------|
| 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 将进入视图。

或者它必须是一个程序?我有查询来查找 activity.max(date_started) 并有一个我创建的表 (newTable),例如没有 name 列的 Person 表,但 Id 和 date_joined 列中的数据完全相同。我将如何更新它以具有来自活动表的最新 date_started 和 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

并且合并语句不完整,可能是语法错误或其他原因,因为它引发了错误。

甲骨文数据库。有人告诉我 Pl/​​sql developer 在 sql server 上运行?

【问题讨论】:

  • 您使用的是 MS SQL Server 还是 Oracle?

标签: sql sql-server oracle plsql


【解决方案1】:

您的合并失败,因为 T.person_id 上缺少 group by 子句。

您可以从子查询内的活动表中获取数据,并将其与人员表左连接以获得所需的结果。

例子:-

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多