从另一个中减去 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"