GBase 8s
适配迁移
问答

使用 SQL 查询 报没有当前游标,使用到了 sys_connect_by_path

发表于2024-08-02 14:18:24199次浏览20个评论

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

【GBase版本】:GBase8sV8.8_TL_3.5.1_3_6a4e30

【操作系统】:

【CPU】:

【问题描述】*:   select
pm.all_sample_no as sampleLabNo, ,sm.sample_count as collectNum
from person_info pi   left join CONSIGNMENT c on c.id = pi.CONSIGNMENT_ID
left join CASE_INFO CI ON CI.ID = C.EVENT_ID
left join LAB_INFO li on pi.LAB_ID = li.id   left join (select spm.person_object_id ,count(si.id) as sample_count from sample_info si,sample_person_map spm
where si.id = spm.sample_id
and si.delete_flag = 0
group by spm.person_object_id) sm on pi.id = sm.person_object_id
left join (select pid, max(sys_connect_by_path(sln, ';')) all_sample_no
from (select pid,
sln,
(row_number()
over(order by pid, sln desc) + dense_rank()
over(order by pid)) rn,
max(sln) over(partition by pid) sln1
from (select spm.person_object_id as pid,
coalesce(si.sample_lab_no, ' ') as sln
from sample_person_map spm
left join sample_info si on si.id = spm.sample_id
where si.delete_flag = 0))
start with sln = sln1
connect by rn - 1 = prior rn
group by pid) pm on pi.id = pm.pid    

 

评论

登录后才可以发表评论
GBase用户17847发表于 2年前
不是说兼容 Oracle语法吗
9527发表于 2年前
@GBase用户17847:1.可以使用set environment sqlmode ‘oracle’ ;开启oracle兼容模式。
2.oracle的大部分功能确实已经兼容了,如果还有不支持的,欢迎提供用例,我们继续去做兼容。
9527发表于 2年前
可以提供表结构吗?我们这边测试一下
GBase用户17847发表于 2年前
@9527:表太多了,不好发,
9527发表于 2年前
@GBase用户17847:可以压缩后发邮箱,地址qinruilin@gbase.cn

表:
sample_person_map
sample_info
CASE_INFO
LAB_INFO
person_info
CONSIGNMENT
GBase用户17847发表于 2年前
@9527:发了
9527发表于 2年前
@GBase用户17847:没有收到呀,换个邮箱 1625992327@qq.com
GBase用户17847发表于 2年前
@9527:发了
9527发表于 2年前
@GBase用户17847:语句中的max(sys_connect_by_path(sln, ';')) 问题我们会排期修复,语句也可以做如下改下:
select pid, sys_connect_by_path(sln, ';') all_sample_no
from (select pid,
sln,
(row_number()
over(order by pid, sln desc) + dense_rank()
over(order by pid)) rn,
max(sln) over(partition by pid) sln1
from (select spm.person_object_id as pid,
coalesce(si.sample_lab_no, ' ') as sln
from sample_person_map spm
left join sample_info si on si.id = spm.sample_id
where si.delete_flag = 0))
start with sln = sln1
connect by rn - 1 = prior rn
into temp tmp1;

select pid,max(all_sample_no) all_sample_no
from tmp1
group by pid
into temp tmp2;



select
pm.all_sample_no as sampleLabNo,sm.sample_count as collectNum
from person_info pi left join CONSIGNMENT c on c.id = pi.CONSIGNMENT_ID
left join CASE_INFO CI ON CI.ID = C.EVENT_ID
left join LAB_INFO li on pi.LAB_ID = li.id
left join (select spm.person_object_id ,count(si.id) as sample_count from sample_info si,sample_person_map spm
where si.id = spm.sample_id
and si.delete_flag = 0
group by spm.person_object_id) sm on pi.id = sm.person_object_id
left join tmp2 pm on pi.id = pm.pid
;
最佳回答
GBase用户17847发表于 2年前
@9527:我改成了这样了,但还是报语法错误 这是完整SQL


SELECT
r.*
FROM
(
SELECT
pid,
SYS_CONNECT_BY_PATH( sln, ';' ) all_sample_no
FROM
(
SELECT
pid,
sln,
(
ROW_NUMBER() OVER(
ORDER BY
pid,
sln DESC
)+ DENSE_RANK() OVER(
ORDER BY
pid
)
) rn,
MAX( sln ) OVER(
PARTITION BY pid
) sln1
FROM
(
SELECT
spm.person_object_id AS pid,
COALESCE(
si.sample_lab_no,
' '
) AS sln
FROM
sample_person_map spm
LEFT JOIN sample_info si ON
si.id = spm.sample_id
WHERE
si.delete_flag = 0
)
) START WITH sln = sln1 CONNECT BY rn - 1 = PRIOR rn INTO
temp tmp1;

SELECT
pid,
MAX( all_sample_no ) all_sample_no
FROM
tmp1
GROUP BY
pid INTO
temp tmp2;

SELECT
pm.all_sample_no AS sampleLabNo,
pi.id,
pi.init_server_no,
pi.lab_id,
pi.consignment_id,
pi.consign_org_code,
pi.input_category,
pi.db_category,
pi.person_no,
pi.person_name,
pi.generate_mode,
pi.alias,
pi.gender,
pi.birth_datetime,
pi.age,
pi.id_card_no,
pi.certificate_type,
pi.certificate_no,
pi.race,
pi.nationality,
pi.mobile_phone,
pi.home_phone,
pi.email,
pi.education_level,
pi.identity,
pi.occupation,
pi.native_place_regionalism,
pi.native_place_addr,
pi.residence_regionalism,
pi.residence_addr,
pi.fingerprint_no,
pi.blood_type,
pi.height,
pi.bodily_form,
pi.birth_date_from,
pi.birth_date_to,
pi.rough_age,
pi.roughly_birthdate,
pi.missing_type,
pi.missing_time,
pi.missing_place,
pi.extrinsic_sign,
pi.special_sign,
pi.involved_case_name,
pi.involved_case_no,
pi.case_property,
pi.prison_type,
pi.prison_no,
pi.death_flag,
pi.delete_flag,
pi.index_flag,
pi.transfer_flag,
pi.transfer_user,
pi.transfer_datetime,
pi.data_source,
pi.remark,
pi.create_user,
pi.create_datetime,
pi.update_user,
pi.update_datetime,
pi.person_label,
pi.abduct_type,
pi.if_sampling,
pi.sampling_datetime,
pi.sampling_regionalism,
pi.if_testdna,
pi.test_datetime,
pi.test_regionalism,
pi.family_no,
pi.family_name,
pi.hiredate,
pi.dg_case_name,
pi.if_finger,
pi.dg_data_type,
pi.post,
pi.communication_address,
pi.unit,
pi.guardian_date,
pi.communication_regionalism,
pi.memory,
pi.other_info,
pi.missing_place_regionalism,
(
SELECT
sd.dict_value1
FROM
sys_dict sd
WHERE
PI.DB_CATEGORY = sd.dict_key
AND sd.dict_category = 'PERSON_CATEGORY'
) AS dbCategoryName,
(
SELECT
sd.dict_value1
FROM
sys_dict sd
WHERE
pi.INPUT_CATEGORY = sd.dict_key
AND sd.dict_category = 'PERSON_CATEGORY'
) AS inputCategoryName,
(
SELECT
sd.dict_value1
FROM
sys_dict sd
WHERE
PI.GENDER = sd.dict_key
AND sd.dict_category = 'GENDER'
) AS genderName,
(
SELECT
sd.dict_value1
FROM
sys_dict sd
WHERE
PI.EDUCATION_LEVEL = sd.dict_key
AND sd.dict_category = 'EDUCATION_LEVEL'
) AS educationLevelName,
(
SELECT
sd.dict_value1
FROM
sys_dict sd
WHERE
PI.NATIONALITY = sd.dict_key
AND sd.dict_category = 'COUNTRY'
) AS nationalityName,
(
SELECT
sd.dict_value1
FROM
sys_dict sd
WHERE
PI.RACE = sd.dict_key
AND sd.dict_category = 'NATIONALITY'
) AS raceName,
(
SELECT
sd.dict_value1
FROM
sys_dict sd
WHERE
PI.CERTIFICATE_TYPE = sd.dict_key
AND sd.dict_category = 'CERTIFICATE_TYPE'
) AS certificateTypeName,
(
SELECT
sd.dict_value1
FROM
sys_dict sd
WHERE
PI.CASE_PROPERTY = sd.dict_key
AND sd.dict_category = 'CASE_PROPERTY'
) AS casePropertyName,
(
SELECT
sd.dict_value1
FROM
sys_dict sd
WHERE
PI.PRISON_TYPE = sd.dict_key
AND sd.dict_category = 'PRISON_TYPE'
) AS prisonTypeName,
CI.CASE_NAME AS caseName,
CI.CASE_BRIEF AS caseBrief,
C.ACCEPT_ORG_NAME AS acceptOrgName,
C.CONSIGN_ORG_REGIONALISM AS consignOrgRegionalism,
C.CONSIGN_ORG_NAME AS consignOrgName,
C.CONSIGNER_NAME AS consignerName,
C.CONSIGNER_NAME2 AS consignerName2,
C.ACCEPTOR_NAME AS acceptorName,
C.CONSIGN_DATETIME AS consignDate,
li.LAB_REGIONALISM AS labRegionalism,
sm.sample_count AS collectNum
FROM
person_info pi
LEFT JOIN CONSIGNMENT c ON
c.id = pi.CONSIGNMENT_ID
LEFT JOIN CASE_INFO CI ON
CI.ID = C.EVENT_ID
LEFT JOIN LAB_INFO li ON
pi.LAB_ID = li.id
LEFT JOIN(
SELECT
spm.person_object_id,
COUNT( si.id ) AS sample_count
FROM
sample_info si,
sample_person_map spm
WHERE
si.id = spm.sample_id
AND si.delete_flag = 0
GROUP BY
spm.person_object_id
) sm ON
pi.id = sm.person_object_id
LEFT JOIN tmp2 pm ON
pi.id = pm.pid
WHERE
1 = 1
AND pi.CONSIGNMENT_ID ='996252404FE2314BA4BD50CBD245B671'
AND(
pi.GENERATE_MODE ='1'
)
ORDER BY
pi.CREATE_DATETIME
) r
WHERE
1 = 1
9527发表于 2年前
@GBase用户17847:语法不对,into temp 之上应该是完整的,可运行的sql。原则是将临时结果存储起来,供下一步使用。
GBase用户17847发表于 2年前
@9527:我把 保存 临时表那步放在了最外层,然后执行还是报错
9527发表于 2年前
@GBase用户17847:放外层也不对,因为内部sql就出错了,需要多个临时表连用。主要是为了绕过max(sys_connect_by_path(sln, ';')) 。你可以看看我写的例子,以那个为模版添加字段。
GBase用户17847发表于 2年前
@9527:还有个问题 select '1' as dataType,
'DNA信息' as dataTypeName,
(select count(1)
from transfer_record tr
where tr.transfer_data_type in ('1', '13')
and tr.transfer_data_status in ('1', '3')) as waitingCount,
(select count(1)
from transfer_record tr
where tr.transfer_data_type in ('1', '13')
and tr.transfer_data_status = '5') as sendingCount,
(select count(1)
from transfer_record tr
where tr.transfer_data_type in ('1', '13')
and tr.transfer_data_status = '2') as successCount,
(select count(1)
from transfer_record tr
where tr.transfer_data_type in ('1', '13')
and tr.transfer_data_status = '4') as failCount
from dual



union all
select '4' as dataType,
'实验室用户信息' as dataTypeName,
(select count(1)
from transfer_record tr
where tr.transfer_data_type = '4'
and tr.transfer_data_status in ('1', '3')) as waitingCount,
(select count(1)
from transfer_record tr
where tr.transfer_data_type = '4'
and tr.transfer_data_status = '5') as sendingCount,
(select count(1)
from transfer_record tr
where tr.transfer_data_type = '4'
and tr.transfer_data_status = '2') as successCount,
(select count(1)
from transfer_record tr
where tr.transfer_data_type = '4'
and tr.transfer_data_status = '4') as failCount
from dual
union all
select '5' as dataType,
'实验室通讯消息' as dataTypeName,
(select count(1)
from transfer_record tr
where tr.transfer_data_type = '5'
and tr.transfer_data_status in ('1', '3')) as waitingCount,
(select count(1)
from transfer_record tr
where tr.transfer_data_type = '5'
and tr.transfer_data_status = '5') as sendingCount,
(select count(1)
from transfer_record tr
where tr.transfer_data_type = '5'
and tr.transfer_data_status = '2') as successCount,
(select count(1)
from transfer_record tr
where tr.transfer_data_type = '5'
and tr.transfer_data_status = '4') as failCount
from dual 这种查出来的 dataTypeName 为什么会有空格,dataTypeName值短的会自动有空格
9527发表于 2年前
@GBase用户17847:麻烦提供一下表transfer_record的结构
GBase用户51883发表于 2个月前
好问题啊。
半夏发表于 2个月前
不清楚啊。
过客发表于 2个月前
坐等大佬解析。
爱笑的眼睛发表于 2个月前
看看啦。
过客发表于 2个月前
好问题啊。