create table xx_base_tbl
(
tbl_id number
, trx_num varchar2(100)
);
create table xx_dtl_tbl
(
dtl_id number
, tbl_id number
, category varchar2(100)
, attribute1 varchar2(100)
);
insert into xx_base_tbl (tbl_id, trx_num) values (1, 'trx 1');
insert into xx_base_tbl (tbl_id, trx_num) values (2, 'trx 2');
insert into xx_base_tbl (tbl_id, trx_num) values (3, 'trx 3');
insert into xx_base_tbl (tbl_id, trx_num) values (4, 'trx 4');
insert into xx_base_tbl (tbl_id, trx_num) values (5, 'trx 5');
insert into xx_dtl_tbl (dtl_id, tbl_id, category, attribute1) values (1, 1, null, 'SAMPLE');
insert into xx_dtl_tbl (dtl_id, tbl_id, category, attribute1) values (2, 1, null, 'hello');
insert into xx_dtl_tbl (dtl_id, tbl_id, category, attribute1) values (3, 2, 'PREPAYMENT', 'this is not a value');
insert into xx_dtl_tbl (dtl_id, tbl_id, category, attribute1) values (4, 2, 'PREPAYMENT', 1);
insert into xx_dtl_tbl (dtl_id, tbl_id, category, attribute1) values (5, 3, 'PREPAYMENT', 2);
insert into xx_dtl_tbl (dtl_id, tbl_id, category, attribute1) values (6, 3, 'PREPAYMENT', 1);
insert into xx_dtl_tbl (dtl_id, tbl_id, category, attribute1) values (7, 3, 'SAMPLE', 15678);
insert into xx_dtl_tbl (dtl_id, tbl_id, category, attribute1) values (8, 4, 'PREPAYMENT', 1);
insert into xx_dtl_tbl (dtl_id, tbl_id, category, attribute1) values (9, 4, 'PREPAYMENT', NULL);
insert into xx_dtl_tbl (dtl_id, tbl_id, category, attribute1) values (10, 5, 'PREPAYMENT', null);
insert into xx_dtl_tbl (dtl_id, tbl_id, category, attribute1) values (11, 5, 'SAMPLE', 'YEY');
我正在使用下面的ANSI语法将xx_dtl_tbl外部连接到另一个xx_base_tbl仅显示预付款和数字值的类别。然后使用
LISTAGG()
将结果聚合到一行中
SELECT
xx1.trx_num,
LISTAGG(xx3.trx_num, ',') WITHIN GROUP(
ORDER BY
xx3.trx_num
) prepayment
FROM
xx_base_tbl xx1
INNER JOIN xx_dtl_tbl xx2 ON xx1.tbl_id = xx2.tbl_id
LEFT JOIN xx_base_tbl xx3 ON (to_number(xx2.attribute1) = xx3.tbl_id and length(TRIM(translate(xx2.attribute1, ' +-.0123456789', ' '))) IS NULL)
GROUP BY
xx1.trx_num
TRX_NUM PREPAYMENT
------- -------------
trx 1
trx 2 trx 1
trx 3 trx 1,trx 2
trx 4 trx 1
trx 5
然而,当我使用
SQL Developer's tool to change the syntax to Oracle Join Syntax
SELECT
xx1.trx_num,
LISTAGG(xx3.trx_num, ',') WITHIN GROUP(
ORDER BY
xx3.trx_num
) prepayment
FROM
xx_base_tbl xx1,
xx_dtl_tbl xx2,
xx_base_tbl xx3
WHERE
xx1.tbl_id = xx2.tbl_id
AND to_number(xx2.attribute1) = xx3.tbl_id (+)
AND ( length(TRIM(translate(xx2.attribute1, ' +-.0123456789', ' '))) IS NULL )
GROUP BY
xx1.trx_num
结果改变了:
TRX_NUM PREPAYMENT
------- -------------
trx 2 trx 1
trx 3 trx 1,trx 2
trx 4 trx 1
trx 5
trx 1行突然丢失。如何用Oracle语法编写此代码?