在视图 SQL-ORACLE 中创建子查询

Posted

技术标签:

【中文标题】在视图 SQL-ORACLE 中创建子查询【英文标题】:Create a subquery in a view SQL- ORACLE 【发布时间】:2019-07-29 20:58:19 【问题描述】:

我正在设置一个数据库视图。

我有一个表 PERSON 和一个由 person_id 关联的 RELATION_COMPANY。我正在尝试从关系公司获取每个 person_id 的最短日期。

我需要使用子查询吗?

这是我迄今为止尝试过的。

CREATE OR REPLACE VIEW PEOPLE_ADDRESS
select
    p.id as ADDRESS_CODE,
    case p.type_
        when 1 then 'JURIDICAL'
        when 0 then 'NATURAL'
    end PERSON_TYPE,
    (select min(start_date) from relation_company where relation_company.person_id = p.id) as INITIAL_dATE
    P.ID as PERSON_CODE,
    p.ADDRESS_NAME as ADDRESS,
    p.POSTAL_CODE as POSTAL_CODE,
    case P.COUNTRY_ID
        when 68 then 'NO'
        else 'YES'
    end FOREIGN_INDICATOR

from
    PERSON p join relation_company r on relation_company = p.id ;

这是我的人表:

ID TYPE_ ADDRESS_NAME          NAME             OTHER COLUMNS
1   0    AVENUE SMITH, 19      MICHAEL SCOTT     ....
2   1    OXFORD STREET , 119   COMPANY A          ....
3   1    CHESTHAM ROAD, 7      COMPANY B          ....

这是 RELATION_COMPANY 表:

ID      PERSON_ID       START_DATE
1           1           2016-12-12 00:00:00
2           1           1981-07-09 00:00:00
3           2           1991-10-10 00:00:00
4           2           1981-03-09 00:00:00
5           3           1984-07-05 00:00:00
6           3           1981-08-11 00:00:00
7           3           1987-07-09 00:00:00
8           3           2011-07-09 00:00:00

select min(START_DATE) from RELATION_COMPANY group by PERSON_ID;

结果应该是:

ADDRESS_CODE  PERSON_TYPE    INITIAL_dATE                 other columns
1             NATURAL        1981-07-09 00:00:00             ....
2            JURIDICAL      1981-03-09 00:00:00               ....
3             JURIDICAL     1981-08-11 00:00:00

我想获取每个 person_id 的 min(start_date) 并将其打印到视图的 INITIAL_dATE 列。

我无法创建该查询。

【问题讨论】:

【参考方案1】:

您已经有了解决方案,此查询在您的 SELECT 语句中缺少“person_id”列。 更改此查询

select min(START_DATE) from RELATION_COMPANY group by PERSON_ID;

到这里。

select min(START_DATE),PERSON_ID from RELATION_COMPANY group by PERSON_ID;

希望这会有所帮助。

【讨论】:

【参考方案2】:

您的解决方案不需要子查询。 只在您的查询中添加一个组子句。

喜欢这个:

select
p.id as PERSON_ID,
case p.type_
    when '1' then 'JURIDICAL'
    when '0' then 'NATURAL'
end PERSON_TYPE,
min(start_date) as INITIAL_dATE,
p.ADDRESS_NAME as ADDRESS,
p.POSTAL_CODE as POSTAL_CODE,
case P.COUNTRY_ID
    when 68 then 'NO'
    else 'YES'
end FOREIGN_INDICATOR
from PERSON p join relation_company r on r.person_id = p.id 
group by p.id, type_, ADDRESS_NAME, POSTAL_CODE, P.COUNTRY_ID;

【讨论】:

以上是关于在视图 SQL-ORACLE 中创建子查询的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Querydsl 中创建子查询

在主窗体中创建子窗体

如何在 PHP 中创建子查询?

使用子查询的替代方法 - 无法在 Mysql 中创建视图

我无法在 FROM 子句中创建包含子查询的视图

使用 peewee 创建子查询,在子查询结果上使用 `.select`