Snowflake cloud data platform 在Snowflake中替换子查询
我不熟悉Snowflake SQL,并尝试将代码从Oracle SQL迁移到Snowflake SQL 我在Oracle中使用的子查询在Snowflake中不受支持,它给出了以下err-r SQL编译错误:无法计算不支持的子查询类型 原始SQL查询-Snowflake cloud data platform 在Snowflake中替换子查询,snowflake-cloud-data-platform,snowflake-schema,Snowflake Cloud Data Platform,Snowflake Schema,我不熟悉Snowflake SQL,并尝试将代码从Oracle SQL迁移到Snowflake SQL 我在Oracle中使用的子查询在Snowflake中不受支持,它给出了以下err-r SQL编译错误:无法计算不支持的子查询类型 原始SQL查询- select p."EMPLOYEE#" as Employee_ID, (select o."POSITION_NO" from ah_occupancy o where o."EMPLOYEE
select p."EMPLOYEE#" as Employee_ID,
(select o."POSITION_NO" from ah_occupancy o where o."EMPLOYEE_NO" = p."EMPLOYEE#" and o."JOB_NO" = p."JOB#" and p."WORKDATE" between o."PORTION_START" and o."PORTION_END") as Position_ID,
j."COMPANY_CODE",
date(p."WORKDATE") as Work_Date,
p."UNIT" as Calculated_Quantity,
p."PAYCODE"
from
"ODS"."HRIS"."PEPAYTRAN" p, job j
where p."EMPLOYEE#" =j."EMPLOYEE#"
and p."JOB#" = j."JOB#"
and date( p."WORKDATE") between '2021-02-04' and '2021-02-10'-->='11-FEB-2021'
and p."ORIGIN" not in ('RC101','FC801','WK8276')
and p."PAYCODE" not in ('GPPL', 'CLAMS')
and p."PAYCODE" not like 'JK%'
and p."TP" >= '01-JAN-2021'
and nvl(p."BATCH#",' ') not in ('MUHTSL','MUHTS','ICWTS','RDOAC','NU011','1')) ;
我重新定义了查询,它编译并给出了相同数量的记录,任何人都可以查看代码并进行注释,如果相同或不正确,请对其进行注释
select p."EMPLOYEE#" as Employee_ID,
o.position_no as Position_ID,
j."COMPANY_CODE",
date(p."WORKDATE") as Work_Date,
p."UNIT" as Calculated_Quantity,
p."PAYCODE"
from
"ODS"."HRIS"."PEPAYTRAN" p, "ODS"."HRIS"."JOB" j, "ODS"."HRIS"."AH_OCCUPANCY" o
where p."EMPLOYEE#" =j."EMPLOYEE#"
and p."JOB#" = j."JOB#"
and date( p."WORKDATE") between '2021-02-04' and '2021-02-10'-->='11-FEB-2021'
and p."ORIGIN" not in ('RC101','FC801','WK8276')
and p."PAYCODE" not in ('GPPL', 'CLAMS')
and p."PAYCODE" not like 'JK%'
and p."TP" >= '01-JAN-2021'
and nvl(p."BATCH#",' ') not in ('MUHTSL','MUHTS','ICWTS','RDOAC','NU011','1')
and o."EMPLOYEE_NO" = p."EMPLOYEE#" and o."JOB_NO" = p."JOB#" and p."WORKDATE" between o."PORTION_START" and o."PORTION_END"
这两个查询是等价的。通过运行以下查询,可以检查两者是否返回相同的信息:
--original query
select
p."EMPLOYEE#" as Employee_ID,
(select
o."POSITION_NO"
from
ah_occupancy o
where
o."EMPLOYEE_NO" = p."EMPLOYEE#"
and o."JOB_NO" = p."JOB#"
and p."WORKDATE" between o."PORTION_START" and o."PORTION_END"
) as Position_ID,
j."COMPANY_CODE",
date(p."WORKDATE") as Work_Date,
p."UNIT" as Calculated_Quantity,
p."PAYCODE"
from
"ODS"."HRIS"."PEPAYTRAN" p,
job j
where
p."EMPLOYEE#" =j."EMPLOYEE#"
and p."JOB#" = j."JOB#"
and date( p."WORKDATE") between '2021-02-04' and '2021-02-10'-->='11-FEB-2021'
and p."ORIGIN" not in ('RC101','FC801','WK8276')
and p."PAYCODE" not in ('GPPL', 'CLAMS')
and p."PAYCODE" not like 'JK%'
and p."TP" >= '01-JAN-2021'
and nvl(p."BATCH#",' ') not in ('MUHTSL','MUHTS','ICWTS','RDOAC','NU011','1')) ;
minus
--new query
select
p."EMPLOYEE#" as Employee_ID,
o.position_no as Position_ID,
j."COMPANY_CODE",
date(p."WORKDATE") as Work_Date,
p."UNIT" as Calculated_Quantity,
p."PAYCODE"
from
"ODS"."HRIS"."PEPAYTRAN" p,
"ODS"."HRIS"."JOB" j,
"ODS"."HRIS"."AH_OCCUPANCY" o
where
p."EMPLOYEE#" =j."EMPLOYEE#"
and p."JOB#" = j."JOB#"
and date( p."WORKDATE") between '2021-02-04' and '2021-02-10'-->='11-FEB-2021'
and p."ORIGIN" not in ('RC101','FC801','WK8276')
and p."PAYCODE" not in ('GPPL', 'CLAMS')
and p."PAYCODE" not like 'JK%'
and p."TP" >= '01-JAN-2021'
and nvl(p."BATCH#",' ') not in ('MUHTSL','MUHTS','ICWTS','RDOAC','NU011','1')
and o."EMPLOYEE_NO" = p."EMPLOYEE#"
and o."JOB_NO" = p."JOB#"
and p."WORKDATE" between o."PORTION_START" and o."PORTION_END"
您还可以尝试以下同样等效的查询:
select
p."EMPLOYEE#" as Employee_ID,
o.position_no as Position_ID,
j."COMPANY_CODE",
date(p."WORKDATE") as Work_Date,
p."UNIT" as Calculated_Quantity,
p."PAYCODE"
from
"ODS"."HRIS"."PEPAYTRAN" p
inner join "ODS"."HRIS"."JOB" j
on (p."EMPLOYEE#" =j."EMPLOYEE#"
and p."JOB#" = j."JOB#")
inner join "ODS"."HRIS"."AH_OCCUPANCY" o
on (o."EMPLOYEE_NO" = p."EMPLOYEE#"
and o."JOB_NO" = p."JOB#"
and p."WORKDATE" between o."PORTION_START" and o."PORTION_END" )
where
date( p."WORKDATE") between '2021-02-04' and '2021-02-10'-->='11-FEB-2021'
and p."ORIGIN" not in ('RC101','FC801','WK8276')
and p."PAYCODE" not in ('GPPL', 'CLAMS')
and p."PAYCODE" not like 'JK%'
and p."TP" >= '01-JAN-2021'
and nvl(p."BATCH#",' ') not in ('MUHTSL','MUHTS','ICWTS','RDOAC','NU011','1')
如果新版本的查询运行并产生正确的结果,您面临的问题和您提出的问题是什么?我希望有人检查这两个代码,并检查它们在技术上是否相同。如果它们都产生相同的结果,那么它们在技术上是相同的