微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从多个相同类型的 PL/SQL 集合中选择

如何解决从多个相同类型的 PL/SQL 集合中选择

有类型

CREATE OR REPLACE TYPE DATE_RANGE IS OBJECT (
    STARTDATE DATE,ENDDATE DATE
);

CREATE OR REPLACE TYPE DATE_RANGES_T IS TABLE OF DATE_RANGE;

和每行集合的表格

---------------------------------------------------------
    | COLUMN
---------------------------------------------------------
ROW | DATE_RANGES_T(
    |     DATE_RANGE(DATE '2021-01-01',DATE '2021-01-02'),|     DATE_RANGE(DATE '2021-01-03',DATE '2021-01-04'),|     DATE_RANGE(DATE '2021-01-05',DATE '2021-01-06')
    | )
---------------------------------------------------------
ROW | DATE_RANGES_T(
    |     DATE_RANGE(DATE '2021-01-07',DATE '2021-01-08'),|     DATE_RANGE(DATE '2021-01-09',DATE '2021-01-10')
    | )
---------------------------------------------------------
ROW | DATE_RANGES_T(
    |     DATE_RANGE(DATE '2021-01-11',DATE '2021-01-12')
    | )
---------------------------------------------------------

是否可以从该表中选择所有 date_range 的对象来生成这样的结果集?

DATE_RANGE(DATE '2021-01-01',DATE '2021-01-02')
DATE_RANGE(DATE '2021-01-03',DATE '2021-01-04')
DATE_RANGE(DATE '2021-01-05',DATE '2021-01-06')
DATE_RANGE(DATE '2021-01-07',DATE '2021-01-08')
DATE_RANGE(DATE '2021-01-09',DATE '2021-01-10')
DATE_RANGE(DATE '2021-01-11',DATE '2021-01-12')

类似的东西

WITH TT AS (
    SELECT DATE_RANGES_T(
        DATE_RANGE(DATE '2021-01-01',DATE_RANGE(DATE '2021-01-03',DATE_RANGE(DATE '2021-01-05',DATE '2021-01-06')
    ) DT FROM DUAL
    UNION ALL
    SELECT DATE_RANGES_T(
        DATE_RANGE(DATE '2021-01-07',DATE_RANGE(DATE '2021-01-09',DATE '2021-01-10')
    )  FROM DUAL
    UNION ALL
    SELECT DATE_RANGES_T(
        DATE_RANGE(DATE '2021-01-11',DATE '2021-01-12')
    ) FROM DUAL
)
SELECT
    (SELECT STARTDATE FROM TABLE(DT)),(SELECT ENDDATE FROM TABLE(DT))
FROM TT;

但没有发生 ORA-01427: single-row subquery returns more than one row 错误

在 Oracle 数据库 11.2 中

解决方法

您需要使用 TABLE() 函数如下:

WITH TT AS (
    SELECT DATE_RANGES_T(
        DATE_RANGE(DATE '2021-01-01',DATE '2021-01-02'),DATE_RANGE(DATE '2021-01-03',DATE '2021-01-04'),DATE_RANGE(DATE '2021-01-05',DATE '2021-01-06')
    ) DT FROM DUAL
    UNION ALL
    SELECT DATE_RANGES_T(
        DATE_RANGE(DATE '2021-01-07',DATE '2021-01-08'),DATE_RANGE(DATE '2021-01-09',DATE '2021-01-10')
    )  FROM DUAL
    UNION ALL
    SELECT DATE_RANGES_T(
        DATE_RANGE(DATE '2021-01-11',DATE '2021-01-12')
    ) FROM DUAL
)
SELECT T.STARTDATE,T.ENDDATE FROM TT,TABLE(TT.DT) T;

db<>fiddle

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。