LISTAGG ON OVERFLOW TRUNCATE 缺少右括号错误
Missing right parenthesis error for LISTAGG ON OVERFLOW TRUNCATE
我正在使用 ON OVERFLOW TRUNCATE
逻辑来实现 LISTAGG
功能。
但是在如下实施时,出现错误
ORA-00907: missing right parenthesis
这里是查询
SELECT IMG.IMG_TYPE, LISTAGG(TO_CHAR(IMG.IMG_NAME), ' ' ON OVERFLOW TRUNCATE )
WITHIN GROUP (ORDER BY IMG.IMG_TYPE) AS IMAGES
FROM TBL_VSAT_MST_DETAIL VT
INNER JOIN TBL_VSAT_IMAGE_DETAIL IMG ON VT.VSAT_DETAIL_ID = 2414
WHERE VT.SAP_ID = 'I-OR-GCHP-ENB-9031'
AND VT.CANDIDATE_ID = 'C1'
GROUP BY IMG.IMG_TYPE;
如何解决这个错误?
ON OVERFLOW TRUNCATE
仅在大约九年前发布的 Oracle 12c 之后可用。最新版本是 21c。你应该考虑升级。
无论如何,您的查询看起来好像是在内部联接表,而实际上是交叉联接它们。您查看某些 TBL_VSAT_MST_DETAIL 行,然后将所有 TBL_VSAT_IMAGE_DETAIL 行加入其中的每一行。
这就是您所拥有的,使用适当的连接子句编写:
SELECT
img.img_type,
LISTAGG(TO_CHAR(img.img_name), ' ' ON OVERFLOW TRUNCATE )
WITHIN GROUP (ORDER BY img.img_type) AS images
FROM tbl_vsat_mst_detail vt
CROSS JOIN tbl_vsat_image_detail img
WHERE vt.sap_id = 'I-OR-GCHP-ENB-9031'
AND vt.candidate_id = 'C1'
AND vt.vsat_detail_id = 2414
GROUP BY img.img_type;
我想 - 但我只能在这里猜测,因为我什至不知道你的桌子到底是什么样子 - 你想要这样的东西:
SELECT
img.img_type,
LISTAGG(img.img_name, ' ') WITHIN GROUP (ORDER BY img.img_name) AS images
FROM tbl_vsat_image_detail img
WHERE img.vsat_id IN
(
SELECT vt.vsat_id
FROM tbl_vsat_mst_detail vt
WHERE vt.sap_id = 'I-OR-GCHP-ENB-9031'
AND vt.candidate_id = 'C1'
AND vt.vsat_detail_id = 2414
)
GROUP BY img.img_type
ORDER BY img.img_type;
也许没有笛卡尔连接,就没有溢出了,问题暂时解决了。
我正在使用 ON OVERFLOW TRUNCATE
逻辑来实现 LISTAGG
功能。
但是在如下实施时,出现错误
ORA-00907: missing right parenthesis
这里是查询
SELECT IMG.IMG_TYPE, LISTAGG(TO_CHAR(IMG.IMG_NAME), ' ' ON OVERFLOW TRUNCATE )
WITHIN GROUP (ORDER BY IMG.IMG_TYPE) AS IMAGES
FROM TBL_VSAT_MST_DETAIL VT
INNER JOIN TBL_VSAT_IMAGE_DETAIL IMG ON VT.VSAT_DETAIL_ID = 2414
WHERE VT.SAP_ID = 'I-OR-GCHP-ENB-9031'
AND VT.CANDIDATE_ID = 'C1'
GROUP BY IMG.IMG_TYPE;
如何解决这个错误?
ON OVERFLOW TRUNCATE
仅在大约九年前发布的 Oracle 12c 之后可用。最新版本是 21c。你应该考虑升级。
无论如何,您的查询看起来好像是在内部联接表,而实际上是交叉联接它们。您查看某些 TBL_VSAT_MST_DETAIL 行,然后将所有 TBL_VSAT_IMAGE_DETAIL 行加入其中的每一行。
这就是您所拥有的,使用适当的连接子句编写:
SELECT
img.img_type,
LISTAGG(TO_CHAR(img.img_name), ' ' ON OVERFLOW TRUNCATE )
WITHIN GROUP (ORDER BY img.img_type) AS images
FROM tbl_vsat_mst_detail vt
CROSS JOIN tbl_vsat_image_detail img
WHERE vt.sap_id = 'I-OR-GCHP-ENB-9031'
AND vt.candidate_id = 'C1'
AND vt.vsat_detail_id = 2414
GROUP BY img.img_type;
我想 - 但我只能在这里猜测,因为我什至不知道你的桌子到底是什么样子 - 你想要这样的东西:
SELECT
img.img_type,
LISTAGG(img.img_name, ' ') WITHIN GROUP (ORDER BY img.img_name) AS images
FROM tbl_vsat_image_detail img
WHERE img.vsat_id IN
(
SELECT vt.vsat_id
FROM tbl_vsat_mst_detail vt
WHERE vt.sap_id = 'I-OR-GCHP-ENB-9031'
AND vt.candidate_id = 'C1'
AND vt.vsat_detail_id = 2414
)
GROUP BY img.img_type
ORDER BY img.img_type;
也许没有笛卡尔连接,就没有溢出了,问题暂时解决了。