Ada*_*ter 8 sql oracle collections
假设您有一个表格如下:
CREATE TABLE EMPLOYEE_SALES
(
EMPLOYEE_ID NUMBER,
PRODUCT_ID NUMBER,
SALE_AMOUNT NUMBER
);
Run Code Online (Sandbox Code Playgroud)
并假设它填充如下:
+-------------+------------+-------------+ | EMPLOYEE_ID | PRODUCT_ID | SALE_AMOUNT | +-------------+------------+-------------+ | 1 | 100 | 1.05 | | 1 | 200 | 45.67 | | 2 | 100 | 3.25 | | 2 | 200 | 34.29 | +-------------+------------+-------------+
现在,假设我创建了一个SALE_TYPE代表(PRODUCT_ID, SALE_AMOUNT)元组的自定义类型:
CREATE TYPE SALE_TYPE IS OBJECT
(
PRODUCT_ID NUMBER,
SALE_AMOUNT NUMBER
);
Run Code Online (Sandbox Code Playgroud)
并假设我还创建了一个名为的自定义类型SALES_TYPE,表示以下TABLE内容SALE_TYPE:
CREATE TYPE SALES_TYPE IS TABLE OF SALE_TYPE;
Run Code Online (Sandbox Code Playgroud)
我想通过查询EMPLOYEE_SALES表组EMPLOYEE_ID.对于每一个EMPLOYEE_ID,我希望创建一个SALES_TYPE包含该员工的销售额.根据文档,我会做这样的事情:
SELECT
EMPLOYEE_ID,
CAST
(
MULTISET
(
SELECT
PRODUCT_ID,
SALE_AMOUNT
FROM
EMPLOYEE_SALES inner_employee_sales
WHERE
inner_employee_sales.employee_id = employee_sales.employee_id
) AS SALES_TYPE
) AS SALES
FROM
EMPLOYEE_SALES
GROUP BY
EMPLOYEE_ID
Run Code Online (Sandbox Code Playgroud)
我希望这个查询产生这样的东西:
+-------------+------------------------------+ | EMPLOYEE_ID | SALES | +-------------+------------------------------+ | 1 | +------------+-------------+ | | | | PRODUCT_ID | SALE_AMOUNT | | | | +------------+-------------+ | | | | 100 | 1.05 | | | | | 200 | 45.67 | | | | +------------+-------------+ | +-------------+------------------------------+ | 2 | +------------+-------------+ | | | | PRODUCT_ID | SALE_AMOUNT | | | | +------------+-------------+ | | | | 100 | 3.25 | | | | | 200 | 34.29 | | | | +------------+-------------+ | +-------------+------------------------------+
有没有办法在不发出子查询的情况下获得相同的结果(我正在处理的真实查询比这个人为的例子复杂得多)?例如,有这样的事情:
SELECT
EMPLOYEE_ID,
CAST
(
COLLECT_ALL_RECORDS_WITHIN_THE_CURRENT_GROUP(
PRODUCT_ID,
SALE_AMOUNT
)
AS SALES_TYPE
) AS SALES
FROM
EMPLOYEE_SALES
GROUP BY
EMPLOYEE_ID
Run Code Online (Sandbox Code Playgroud)
在Oracle 10g中,您可以使用COLLECT运算符,如下所示:
select employee_id,
cast(collect(sale_type(product_id, sale_amount)) as sales_type)
from employee_sales
group by employee_id
Run Code Online (Sandbox Code Playgroud)