1、Patient.FAlternateNo like '%' 这个没啥意义吧,去掉
2、ORDER BY 'PATNAME';order by一个字符串,没啥意义吧,去掉了
SELECT
Patient.fid,
Patient.fName_l1,
Patient.FAlternateNo,
Patient.FAlternateNo2,
Patient.FCoSchemeCode,
Company.FName_l1,
Patient.FHKID,
Patient.FPatientACNo,
OwnerPat.FName_L1 as acctName,
Patient.FStaffGrade,
Contract.FPlanDescription,
Patient.FStatus
FROM
T_UF_Patient Patient
LEFT JOIN T_BD_Company Company ON Patient.FCoCode = Company.FNumber
LEFT JOIN (
select * from T_CM_ContractMain T
where not exists (select 1 from t_cm_contractmain
where NVL(fversionnumber,0)> NVL(T.fversionnumber,0)
and fnumber = T.fnumber
and fid=T.FID)
) Contract ON Patient.FCoSchemeCode = Contract.FNumber
LEFT JOIN T_UF_Patient OwnerPat on Patient.FCOSchemeCode = OwnerPat.FCOSchemeCode
and Patient.FPatientDependACNO = OwnerPat.FPatientACNo
2、ORDER BY 'PATNAME';order by一个字符串,没啥意义吧,去掉了
SELECT
Patient.fid,
Patient.fName_l1,
Patient.FAlternateNo,
Patient.FAlternateNo2,
Patient.FCoSchemeCode,
Company.FName_l1,
Patient.FHKID,
Patient.FPatientACNo,
OwnerPat.FName_L1 as acctName,
Patient.FStaffGrade,
Contract.FPlanDescription,
Patient.FStatus
FROM
T_UF_Patient Patient
LEFT JOIN T_BD_Company Company ON Patient.FCoCode = Company.FNumber
LEFT JOIN (
select * from T_CM_ContractMain T
where not exists (select 1 from t_cm_contractmain
where NVL(fversionnumber,0)> NVL(T.fversionnumber,0)
and fnumber = T.fnumber
and fid=T.FID)
) Contract ON Patient.FCoSchemeCode = Contract.FNumber
LEFT JOIN T_UF_Patient OwnerPat on Patient.FCOSchemeCode = OwnerPat.FCOSchemeCode
and Patient.FPatientDependACNO = OwnerPat.FPatientACNo
解决方案 »
- oracle 连接 SQLPLUS 监听问题
- oracle存储过程效率问题
- oracle 运行在windows系统下与linux下有什么区别吗?
- 利用触发器技术实现双机备份
- 一个关于merge的问题,高手请指教
- .net通过Oledb连接Oracle在本地需要配置是哪些环境?
- 有没有把sqlServer中的表倒入到oracle的工具.(急)
- 有控制文件,日志文件,数据文件,请问如何恢复oracle数据库.
- 不用检索如何直接得到一个查询的ResultSetMetaData?
- linux上oracle 监听启动报错TNS-12535 TNS-12560 TNS-00505
- Oracle怎么查询复选框
- s_ind 什么意思
其实我初始版本是:
SELECT
Patient.fid,
Patient.fName_l1,
Patient.FAlternateNo,
Patient.FAlternateNo2,
Patient.FCoSchemeCode,
Company.FName_l1,
Patient.FHKID,
Patient.FPatientACNo,
OwnerPat.FName_L1 as acctName,
Patient.FStaffGrade,
Contract.FPlanDescription,
Patient.FStatus
FROM
T_UF_Patient Patient
LEFT JOIN T_BD_Company Company ON Patient.FCoCode = Company.FNumber
LEFT JOIN T_CM_ContractMain Contract ON Patient.FCoSchemeCode = Contract.FNumber
LEFT JOIN T_UF_Patient OwnerPat on Patient.FCOSchemeCode = OwnerPat.FCOSchemeCode and Patient.FPatientDependACNO = OwnerPat.FPatientACNo
WHERE
(Patient.FAlternateNo like '<ern>%' or Patient.FHKID = '<hkid>')
and Contract.FID in (
SELECT distinct c1.fid FROM t_cm_contractmain c1,
(SELECT max(fversionnumber) fversionnumber,fnumber FROM t_cm_contractmain GROUP BY fnumber) c2
WHERE NVL(c1.fversionnumber,0) = NVL(c2.fversionnumber,0) and c1.fnumber = c2.fnumber
)
ORDER BY $(sortCriteria)
JOIN (
select * from T_CM_ContractMain T1
WHERE EXISTS (
select * from T_CM_ContractMain T
where not exists (select 1 from t_cm_contractmain
where NVL(fversionnumber,0)> NVL(T.fversionnumber,0)
and fnumber = T.fnumber)
and fid=T1.FID)
) Contract
结果对了, 不过查询了106多秒 和原来的差不多了,请问大神还可以优化哪里么,现在我的 sql 语句是SELECT
Count(*)
FROM
T_UF_Patient Patient
LEFT JOIN T_BD_Company Company ON Patient.FCoCode = Company.FNumber
JOIN (
select * from T_CM_ContractMain T1
WHERE EXISTS (
select * from T_CM_ContractMain T
where not exists (select 1 from t_cm_contractmain
where NVL(fversionnumber,0)> NVL(T.fversionnumber,0)
and fnumber = T.fnumber)
and fid=T1.FID)
) Contract ON Patient.FCoSchemeCode = Contract.FNumber
LEFT JOIN T_UF_Patient OwnerPat on Patient.FCOSchemeCode = OwnerPat.FCOSchemeCode
and Patient.FPatientDependACNO = OwnerPat.FPatientACNo
原始版本是: SELECT
Count(*)
FROM
T_UF_Patient Patient
LEFT JOIN T_BD_Company Company ON Patient.FCoCode = Company.FNumber
LEFT JOIN T_CM_ContractMain Contract ON Patient.FCoSchemeCode = Contract.FNumber
LEFT JOIN T_UF_Patient OwnerPat on Patient.FCOSchemeCode = OwnerPat.FCOSchemeCode and Patient.FPatientDependACNO = OwnerPat.FPatientACNo
WHERE
Contract.FID in (
SELECT distinct c1.fid FROM t_cm_contractmain c1,
(SELECT max(fversionnumber) fversionnumber,fnumber FROM t_cm_contractmain GROUP BY fnumber) c2
WHERE NVL(c1.fversionnumber,0) = NVL(c2.fversionnumber,0) and c1.fnumber = c2.fnumber
);
SELECT * FROM (
SELECT T.*,MIN(RN)OVER(PARTITION BY FID) M FROM(
select T_CM_ContractMain.*,ROW_NUMBER()OVER(PARTITION BY fnumber ORDER BY fversionnumber DESC) RN from T_CM_ContractMain
) T
)WHERE M=1
) Contract
至少确定慢的原因是这了,改为分析函数的写法试试
不行的话只能靠增加索引的方式提高速度了
增加fnumber、 fversionnumber、FID的组合索引
你的意图是每个FNumber只需要最新(fversionnumber最大)一条的 FID 是不是?
可以用 OUTER APPLY,从#10原始版本改的。
SELECT
Count(*)
FROM
T_UF_Patient Patient
LEFT JOIN T_BD_Company Company ON Patient.FCoCode = Company.FNumber
LEFT JOIN T_UF_Patient OwnerPat on Patient.FCOSchemeCode = OwnerPat.FCOSchemeCode and Patient.FPatientDependACNO = OwnerPat.FPatientACNo
OUTER APPLY (SELECT TOP 1 *
FROM T_CM_ContractMain
WHERE FNumber = Patient.FCoSchemeCode
ORDER BY fversionnumber DESC
) Contract