我当前正在创建一个SQL查询,以从通过ID连接的两个表中获取所有记录的结果。如果有多条记录链接到来自另一个表的1个id,是否仍要在1行中返回结果?以下是我的SQL查询,当前结果以及查询的预期结果。
当前查询:
SELECT
'A' AS "actionIndicator", 'A' AS "target",
crdExpt.CRD_PAN,
acnExpt.ACN_ATP_ID, acnExpt.ACN_ACCOUNT_NUMBER,
FROM
tbl1 crdExpt, tbl2 acnExpt, tbl3 crdAcnExpt
其中tbl1
是卡号的记录,tbl2
是帐户号的记录,tbl3
是卡号和帐户的链接。
当前结果如下:
CRD_PAN | ACN_ATP_ID| ACN_ACCOUNT_NUMBER
123456789 | 23 | 99112345678
123456789 | 24 | 99012345678
我要实现的目标是,如果有2个帐号链接到1张卡,则预期输出为:
CRD_PAN | ACN_ATP_ID| ACN_ACCOUNT_NUMBER |ACN_ATP_ID2 | ACN_ACCOUNT_NUMBER2
123456789 | 23 | 99112345678 | 24 | 99012345678
答案 0 :(得分:1)
通过评论中的OP请求:
我在this SQL Fiddle上使用了以下示例数据(查询结果)
CREATE TABLE test(
CRD_PAN VARCHAR(256),
ACN_ATP_ID VARCHAR(256),
ACN_ACCOUNT_NUMBER VARCHAR(256)
);
INSERT INTO test(CRD_PAN, ACN_ATP_ID, ACN_ACCOUNT_NUMBER)
SELECT '123456789', '23', '99112345678' FROM DUAL
UNION ALL
SELECT '123456789', '24', '99012345678' FROM DUAL
;
从那里,我运行以下查询:
SELECT
CRD_PAN,
LISTAGG(ACN_ATP_ID, ', ') WITHIN GROUP (ORDER BY CRD_PAN) AS ACN_ATP_ID,
LISTAGG(ACN_ACCOUNT_NUMBER, ',') WITHIN GROUP (ORDER BY CRD_PAN) AS ACN_ATP_ID
FROM
test
GROUP BY
CRD_PAN
哪个给了我
| CRD_PAN | ACN_ATP_ID | ACN_ATP_ID |
|:---------:|:----------:|:-----------------------:|
| 123456789 | 23, 24 | 99012345678,99112345678 |
所以,我相信一个解决方案可能是:
WITH
test AS (
SELECT
'A' AS "actionIndicator", 'A' AS "target",
crdExpt.CRD_PAN,
acnExpt.ACN_ATP_ID, acnExpt.ACN_ACCOUNT_NUMBER,
FROM tbl1 crdExpt, tbl2 acnExpt, tbl3 crdAcnExpt
),
listdata AS (
SELECT
CRD_PAN,
LISTAGG(ACN_ATP_ID, ', ') WITHIN GROUP (ORDER BY CRD_PAN) AS ACN_ATP_ID,
LISTAGG(ACN_ACCOUNT_NUMBER, ',') WITHIN GROUP (ORDER BY CRD_PAN) AS ACN_ATP_ID
FROM
test
GROUP BY
CRD_PAN
)
SELECT * FROM listdata
通过LISTAGG
函数,您可以将多行移动到一个由某种字符分隔的行中(我用过,
),并且使用了一个子查询来演示如何捕获数据,对其进行汇总以及然后退回