从另一个中减去 1 SQL
Subtract 1 SQL from another
我想了解两个不同 SQL 的区别。
我见过类似的问题,但无法让他们验证。
神谕。
这是我在下面的帮助下做出的决定;
select
(TRUNC( "C__en_zw__V_EVENT_LOG_ENDDATE"."CREATE_TMSTMP" ) - NUMTODSINTERVAL( EXTRACT( DAY FROM TRUNC( "C__en_zw__V_EVENT_LOG_ENDDATE"."CREATE_TMSTMP" ) ), 'DAY' ) + INTERVAL '1' DAY + INTERVAL '1' MONTH - INTERVAL '1' DAY) "Month1",
sum(case when "C__en_zw__V_EVENT_LOG_ENDDATE"."EVENT_CD"='DSP_SUBMITTED'
and "C__en_zw__V_EVENT_LOG_ENDDATE"."DCN" IS NOT NULL
THEN 1
WHEN "C__en_zw__V_EVENT_LOG_ENDDATE"."EVENT_CD" ! ='DSP_SUBMITTED'
and "C__en_zw__V_EVENT_LOG_ENDDATE"."DCN" IS NOT NULL
THEN -1
ELSE 0
END) "DCN"
from
"CJIMRPT"."V_EVENT_LOG_ENDTIME" "C__en_zw__V_EVENT_LOG_ENDDATE",
"CJIMRPT"."V_REMAND" "C__en_zw__V_REMAND"
where "C__en_zw__V_REMAND"."DCN"<>"C__en_zw__V_REMAND"."DOC_ID" and
"C__en_zw__V_EVENT_LOG_ENDDATE"."EVENT_CD"in('DSP_SUBMITTED','CPIC_PUBLISHING', 'DSP_PUBLISHED', 'DSP_PURGED', 'DSP_ARCHIVED', 'DSP_REJECTED', 'DSP_IDENT_ONLY') and
not "C__en_zw__V_EVENT_LOG_ENDDATE"."DCN" is null and
"C__en_zw__V_REMAND"."REMAND_ID"="C__en_zw__V_EVENT_LOG_ENDDATE"."REMAND_ID" and
"C__en_zw__V_EVENT_LOG_ENDDATE"."CREATE_TMSTMP">=CASE WHEN EXTRACT( DAY FROM (TRUNC( SYSDATE ) - NUMTODSINTERVAL( EXTRACT( DAY FROM TRUNC( SYSDATE ) ), 'DAY' ) + INTERVAL '1' DAY) - NUMTODSINTERVAL( EXTRACT( DAY FROM (TRUNC( SYSDATE ) - NUMTODSINTERVAL( EXTRACT( DAY FROM TRUNC( SYSDATE ) ), 'DAY' ) + INTERVAL '1' DAY) ), 'DAY' ) + INTERVAL '1' DAY + NUMTOYMINTERVAL( -4, 'MONTH' ) + INTERVAL '1' MONTH - INTERVAL '1' DAY ) < EXTRACT( DAY FROM (TRUNC( SYSDATE ) - NUMTODSINTERVAL( EXTRACT( DAY FROM TRUNC( SYSDATE ) ), 'DAY' ) + INTERVAL '1' DAY) ) THEN (TRUNC( SYSDATE ) - NUMTODSINTERVAL( EXTRACT( DAY FROM TRUNC( SYSDATE ) ), 'DAY' ) + INTERVAL '1' DAY) - NUMTODSINTERVAL( EXTRACT( DAY FROM (TRUNC( SYSDATE ) - NUMTODSINTERVAL( EXTRACT( DAY FROM TRUNC( SYSDATE ) ), 'DAY' ) + INTERVAL '1' DAY) ), 'DAY' ) + INTERVAL '1' DAY + NUMTOYMINTERVAL( -4, 'MONTH' ) + INTERVAL '1' MONTH - INTERVAL '1' DAY ELSE (TRUNC( SYSDATE ) - NUMTODSINTERVAL( EXTRACT( DAY FROM TRUNC( SYSDATE ) ), 'DAY' ) + INTERVAL '1' DAY) + NUMTOYMINTERVAL( -4, 'MONTH' ) END and
"C__en_zw__V_EVENT_LOG_ENDDATE"."CREATE_TMSTMP"<(TRUNC( SYSDATE ) - NUMTODSINTERVAL( EXTRACT( DAY FROM TRUNC( SYSDATE ) ), 'DAY' ) + INTERVAL '1' DAY)
group by (TRUNC( "C__en_zw__V_EVENT_LOG_ENDDATE"."CREATE_TMSTMP" ) - NUMTODSINTERVAL( EXTRACT( DAY FROM TRUNC( "C__en_zw__V_EVENT_LOG_ENDDATE"."CREATE_TMSTMP" ) ), 'DAY' ) + INTERVAL '1' DAY + INTERVAL '1' MONTH - INTERVAL '1' DAY)
使用 MINUS 运算符从一组记录中减去另一组记录或使用 INTERSECT 查找共同元素。这两个集合必须具有相同的列数。
只需将 - 替换为 MINUS 关键字即可。
Oracle 的例子
SELECT product_id FROM inventories
MINUS
SELECT product_id FROM order_items;
我认为您的问题与 MINUS
运算符无关,但如果我理解正确的话,您想要两个查询的记录计数的减法结果。可以简单的描述如下-
select (select count(*) from dual) - (select count(*) from dual)
from dual;
您需要将 select count(*) from dual
替换为您自己的 count(*)
查询。
请注意,如果您首先应用 MINUS
运算符,正如@kevinsky 在他的回答中所说, 然后 执行 count(*)
您的结果可能不会是可取的或预期的(通过下面的示例说明)-
select count(*)
from (
select * from (select 1 from dual
union
select 2 from dual
union
select 3 from dual
union
select 4 from dual)
minus
select * from (select 1 from dual
union
select 2 from dual
union
select 5 from dual
union
select 6 from dual));
--Retruns result as 2
select (select count(*)
from (select 1 from dual
union
select 2 from dual
union
select 3 from dual
union
select 4 from dual))
-
(select count(*)
from (select 1 from dual
union
select 2 from dual
union
select 5 from dual
union
select 6 from dual)) cnt
from dual;
--Returns result as 0
因为看起来你的两个查询之间的唯一区别是正在考虑 event_cd,你可以将其简化为一个查询,该查询获取你已识别的所有 event_cd ,然后对 'DSP_SUBMITTED' 行(您的顶部查询)求和 1,对其他 event_Cds(您的底部查询)求和 -1。
我使用一个 CASE 检查 EVENT_CD 以查看这是向上计数还是向下计数,并检查 "C__en_zw__V_EVENT_LOG_ENDDATE"."DCN" IS NOT NULL 因为您给定的 COUNT(DCN) 逻辑不计算空值,所以我需要复制该行为。
select sum(case when "C__en_zw__V_EVENT_LOG_ENDDATE"."EVENT_CD"='DSP_SUBMITTED'
and "C__en_zw__V_EVENT_LOG_ENDDATE"."DCN" IS NOT NULL
THEN 1
WHEN "C__en_zw__V_EVENT_LOG_ENDDATE"."EVENT_CD" ! ='DSP_SUBMITTED'
and "C__en_zw__V_EVENT_LOG_ENDDATE"."DCN" IS NOT NULL
THEN -1
ELSE 0
END) "DCN"
from
"CJIMRPT"."V_EVENT_LOG_ENDTIME" "C__en_zw__V_EVENT_LOG_ENDDATE",
"CJIMRPT"."V_REMAND" "C__en_zw__V_REMAND"
where "C__en_zw__V_REMAND"."DCN"<>"C__en_zw__V_REMAND"."DOC_ID" and
"C__en_zw__V_EVENT_LOG_ENDDATE"."EVENT_CD"in('DSP_SUBMITTED','CPIC_PUBLISHING', 'DSP_PUBLISHED', 'DSP_PURGED', 'DSP_ARCHIVED', 'DSP_REJECTED', 'DSP_IDENT_ONLY') and
not "C__en_zw__V_EVENT_LOG_ENDDATE"."DCN" is null and
"C__en_zw__V_REMAND"."REMAND_ID"="C__en_zw__V_EVENT_LOG_ENDDATE"."REMAND_ID"
我想了解两个不同 SQL 的区别。 我见过类似的问题,但无法让他们验证。 神谕。 这是我在下面的帮助下做出的决定;
select
(TRUNC( "C__en_zw__V_EVENT_LOG_ENDDATE"."CREATE_TMSTMP" ) - NUMTODSINTERVAL( EXTRACT( DAY FROM TRUNC( "C__en_zw__V_EVENT_LOG_ENDDATE"."CREATE_TMSTMP" ) ), 'DAY' ) + INTERVAL '1' DAY + INTERVAL '1' MONTH - INTERVAL '1' DAY) "Month1",
sum(case when "C__en_zw__V_EVENT_LOG_ENDDATE"."EVENT_CD"='DSP_SUBMITTED'
and "C__en_zw__V_EVENT_LOG_ENDDATE"."DCN" IS NOT NULL
THEN 1
WHEN "C__en_zw__V_EVENT_LOG_ENDDATE"."EVENT_CD" ! ='DSP_SUBMITTED'
and "C__en_zw__V_EVENT_LOG_ENDDATE"."DCN" IS NOT NULL
THEN -1
ELSE 0
END) "DCN"
from
"CJIMRPT"."V_EVENT_LOG_ENDTIME" "C__en_zw__V_EVENT_LOG_ENDDATE",
"CJIMRPT"."V_REMAND" "C__en_zw__V_REMAND"
where "C__en_zw__V_REMAND"."DCN"<>"C__en_zw__V_REMAND"."DOC_ID" and
"C__en_zw__V_EVENT_LOG_ENDDATE"."EVENT_CD"in('DSP_SUBMITTED','CPIC_PUBLISHING', 'DSP_PUBLISHED', 'DSP_PURGED', 'DSP_ARCHIVED', 'DSP_REJECTED', 'DSP_IDENT_ONLY') and
not "C__en_zw__V_EVENT_LOG_ENDDATE"."DCN" is null and
"C__en_zw__V_REMAND"."REMAND_ID"="C__en_zw__V_EVENT_LOG_ENDDATE"."REMAND_ID" and
"C__en_zw__V_EVENT_LOG_ENDDATE"."CREATE_TMSTMP">=CASE WHEN EXTRACT( DAY FROM (TRUNC( SYSDATE ) - NUMTODSINTERVAL( EXTRACT( DAY FROM TRUNC( SYSDATE ) ), 'DAY' ) + INTERVAL '1' DAY) - NUMTODSINTERVAL( EXTRACT( DAY FROM (TRUNC( SYSDATE ) - NUMTODSINTERVAL( EXTRACT( DAY FROM TRUNC( SYSDATE ) ), 'DAY' ) + INTERVAL '1' DAY) ), 'DAY' ) + INTERVAL '1' DAY + NUMTOYMINTERVAL( -4, 'MONTH' ) + INTERVAL '1' MONTH - INTERVAL '1' DAY ) < EXTRACT( DAY FROM (TRUNC( SYSDATE ) - NUMTODSINTERVAL( EXTRACT( DAY FROM TRUNC( SYSDATE ) ), 'DAY' ) + INTERVAL '1' DAY) ) THEN (TRUNC( SYSDATE ) - NUMTODSINTERVAL( EXTRACT( DAY FROM TRUNC( SYSDATE ) ), 'DAY' ) + INTERVAL '1' DAY) - NUMTODSINTERVAL( EXTRACT( DAY FROM (TRUNC( SYSDATE ) - NUMTODSINTERVAL( EXTRACT( DAY FROM TRUNC( SYSDATE ) ), 'DAY' ) + INTERVAL '1' DAY) ), 'DAY' ) + INTERVAL '1' DAY + NUMTOYMINTERVAL( -4, 'MONTH' ) + INTERVAL '1' MONTH - INTERVAL '1' DAY ELSE (TRUNC( SYSDATE ) - NUMTODSINTERVAL( EXTRACT( DAY FROM TRUNC( SYSDATE ) ), 'DAY' ) + INTERVAL '1' DAY) + NUMTOYMINTERVAL( -4, 'MONTH' ) END and
"C__en_zw__V_EVENT_LOG_ENDDATE"."CREATE_TMSTMP"<(TRUNC( SYSDATE ) - NUMTODSINTERVAL( EXTRACT( DAY FROM TRUNC( SYSDATE ) ), 'DAY' ) + INTERVAL '1' DAY)
group by (TRUNC( "C__en_zw__V_EVENT_LOG_ENDDATE"."CREATE_TMSTMP" ) - NUMTODSINTERVAL( EXTRACT( DAY FROM TRUNC( "C__en_zw__V_EVENT_LOG_ENDDATE"."CREATE_TMSTMP" ) ), 'DAY' ) + INTERVAL '1' DAY + INTERVAL '1' MONTH - INTERVAL '1' DAY)
使用 MINUS 运算符从一组记录中减去另一组记录或使用 INTERSECT 查找共同元素。这两个集合必须具有相同的列数。 只需将 - 替换为 MINUS 关键字即可。
Oracle 的例子
SELECT product_id FROM inventories
MINUS
SELECT product_id FROM order_items;
我认为您的问题与 MINUS
运算符无关,但如果我理解正确的话,您想要两个查询的记录计数的减法结果。可以简单的描述如下-
select (select count(*) from dual) - (select count(*) from dual)
from dual;
您需要将 select count(*) from dual
替换为您自己的 count(*)
查询。
请注意,如果您首先应用 MINUS
运算符,正如@kevinsky 在他的回答中所说, 然后 执行 count(*)
您的结果可能不会是可取的或预期的(通过下面的示例说明)-
select count(*)
from (
select * from (select 1 from dual
union
select 2 from dual
union
select 3 from dual
union
select 4 from dual)
minus
select * from (select 1 from dual
union
select 2 from dual
union
select 5 from dual
union
select 6 from dual));
--Retruns result as 2
select (select count(*)
from (select 1 from dual
union
select 2 from dual
union
select 3 from dual
union
select 4 from dual))
-
(select count(*)
from (select 1 from dual
union
select 2 from dual
union
select 5 from dual
union
select 6 from dual)) cnt
from dual;
--Returns result as 0
因为看起来你的两个查询之间的唯一区别是正在考虑 event_cd,你可以将其简化为一个查询,该查询获取你已识别的所有 event_cd ,然后对 'DSP_SUBMITTED' 行(您的顶部查询)求和 1,对其他 event_Cds(您的底部查询)求和 -1。
我使用一个 CASE 检查 EVENT_CD 以查看这是向上计数还是向下计数,并检查 "C__en_zw__V_EVENT_LOG_ENDDATE"."DCN" IS NOT NULL 因为您给定的 COUNT(DCN) 逻辑不计算空值,所以我需要复制该行为。
select sum(case when "C__en_zw__V_EVENT_LOG_ENDDATE"."EVENT_CD"='DSP_SUBMITTED'
and "C__en_zw__V_EVENT_LOG_ENDDATE"."DCN" IS NOT NULL
THEN 1
WHEN "C__en_zw__V_EVENT_LOG_ENDDATE"."EVENT_CD" ! ='DSP_SUBMITTED'
and "C__en_zw__V_EVENT_LOG_ENDDATE"."DCN" IS NOT NULL
THEN -1
ELSE 0
END) "DCN"
from
"CJIMRPT"."V_EVENT_LOG_ENDTIME" "C__en_zw__V_EVENT_LOG_ENDDATE",
"CJIMRPT"."V_REMAND" "C__en_zw__V_REMAND"
where "C__en_zw__V_REMAND"."DCN"<>"C__en_zw__V_REMAND"."DOC_ID" and
"C__en_zw__V_EVENT_LOG_ENDDATE"."EVENT_CD"in('DSP_SUBMITTED','CPIC_PUBLISHING', 'DSP_PUBLISHED', 'DSP_PURGED', 'DSP_ARCHIVED', 'DSP_REJECTED', 'DSP_IDENT_ONLY') and
not "C__en_zw__V_EVENT_LOG_ENDDATE"."DCN" is null and
"C__en_zw__V_REMAND"."REMAND_ID"="C__en_zw__V_EVENT_LOG_ENDDATE"."REMAND_ID"