【问题标题】:How to merge these queries that insert columns to table如何合并这些将列插入表的查询
【发布时间】:2019-04-07 04:42:13
【问题描述】:

我已经使用光标选择了这些数据。像这样,我可以插入每个数据。我只需要在一个插入命令中合并该查询。

CURSOR moc_local_call_records
      IS
      SELECT RECIPIENT, COUNT(*) N_CNT
      FROM (SELECT RECIPIENT,
                   SERVICE_TYPE,
                   MPS_SWTCH_CD,
                   MPS_FTR_CD1
            FROM ABA_RM_INB_USAGE
            WHERE SERVICE_TYPE = 100
               OR SERVICE_TYPE = 0
              AND MPS_SWTCH_CD = 'T11'
              AND MPS_FTR_CD1 = 1033)
      GROUP BY RECIPIENT;

CURSOR moc_local_home_records
      IS
      SELECT RECIPIENT, COUNT(*) N_CNT
      FROM (SELECT RECIPIENT,
                   SERVICE_TYPE,
                   MPS_FTR_CD1
            FROM ABA_RM_INB_USAGE
            WHERE SERVICE_TYPE = 100
               OR SERVICE_TYPE = 0
              AND MPS_FTR_CD1 = 1031)
      GROUP BY RECIPIENT;

像这样我可以插入每个数据。

FOR mocLocalCallRecords IN moc_local_call_records
      LOOP
        IF mocLocalCallRecords.N_CNT > 0 THEN
          INSERT INTO TRAFFIC_PREPROCESS_INB(TADIG, MOC_LOCAL_CALL_RECORDS)
          VALUES (mocLocalCallRecords.RECIPIENT, mocLocalCallRecords.N_CNT);
        END IF;
    END LOOP;

FOR mocLocalHomeRecords in moc_local_home_records
      LOOP
        IF mocLocalHomeRecords.N_CNT > 0 THEN
          INSERT INTO TRAFFIC_PREPROCESS_INB(moc_local_home_records)
          VALUES (mocLocalHomeRecords.N_CNT);
        end if;
end loop;

我只需要在一个插入命令中合并这些查询。给我一些建议,顺便说一下我是初学者

【问题讨论】:

  • 这适用于哪个 RDBMS?请添加标签以指定您使用的是mysqlpostgresqlsql-serveroracle 还是db2 - 或其他完全不同的东西。
  • ORACLE PL/SQL -------------------------- --------------------------
  • 那么请在您的问题中添加 oracle 标签!

标签: sql oracle stored-procedures plsql


【解决方案1】:

你为什么要使用光标?您可以使用 1 个这样的插入命令轻松插入:

INSERT INTO TRAFFIC_PREPROCESS_INB(TADIG, MOC_LOCAL_CALL_RECORDS)
select RECIPIENT, N_CNT 
from (
SELECT RECIPIENT, COUNT(*) N_CNT
      FROM (SELECT RECIPIENT,
                   SERVICE_TYPE,
                   MPS_SWTCH_CD,
                   MPS_FTR_CD1
            FROM ABA_RM_INB_USAGE
            WHERE SERVICE_TYPE = 100
               OR SERVICE_TYPE = 0
              AND MPS_SWTCH_CD = 'T11'
              AND MPS_FTR_CD1 = 1033)
      GROUP BY RECIPIENT
      HAVING COUNT(*) > 0
union all
SELECT NULL as RECIPIENT, COUNT(*) N_CNT
FROM (SELECT RECIPIENT,
             SERVICE_TYPE,
             MPS_FTR_CD1
      FROM ABA_RM_INB_USAGE
      WHERE SERVICE_TYPE = 100
           OR SERVICE_TYPE = 0
          AND MPS_FTR_CD1 = 1031)
 GROUP BY RECIPIENT
 HAVING COUNT(*) > 0
  )X

希望对你有帮助

【讨论】:

    【解决方案2】:

    如果中间不进行任何转换,可以直接这样插入:

    INSERT INTO TRAFFIC_PREPROCESS_INB(TADIG, MOC_LOCAL_CALL_RECORDS,MOC_LOCAL_HOME_RECORDS)
    SELECT RECIPIENT, COUNT(*) N_CNT, NULL
          FROM (SELECT RECIPIENT,
                       SERVICE_TYPE,
                       MPS_SWTCH_CD,
                       MPS_FTR_CD1
                FROM ABA_RM_INB_USAGE
                WHERE SERVICE_TYPE = 100
                   OR SERVICE_TYPE = 0
                  AND MPS_SWTCH_CD = 'T11'
                  AND MPS_FTR_CD1 = 1033)
          GROUP BY RECIPIENT
          HAVING COUNT(*) > 0;
    
    UNION ALL 
    
    SELECT NULL, NULL, COUNT(*) N_CNT
      FROM (SELECT RECIPIENT,
                   SERVICE_TYPE,
                   MPS_FTR_CD1
            FROM ABA_RM_INB_USAGE
            WHERE SERVICE_TYPE = 100
               OR SERVICE_TYPE = 0
              AND MPS_FTR_CD1 = 1031)
      GROUP BY RECIPIENT
      HAVING COUNT(*) > 0;
    

    【讨论】:

    • 以及如何插入下一个?
    • 同理。插入 traffic_preprocess_inb 从(您的查询)中选择 n_cnt
    • 这对你有帮助吗??
    • 其实没有:(我需要将过滤后的数据逐列插入到表中,这是我的问题。然后我可以直接将该表插入到另一个表中。
    • 如果你需要向两个表中插入数据,你应该有两个插入查询。 count > 0 的条件由“HAVING”子句执行,因此希望更新后的答案能满足您的要求。
    【解决方案3】:

    您的两个查询非常相似,where 子句中的谓词差别不大。由于您按 RECIPIENT 分组并且想要一个 Count(*),因此它们都可以合并到一个更简单的查询中,就像这样

    SELECT RECIPIENT, COUNT(*) N_CNT       
    FROM ABA_RM_INB_USAGE
    WHERE SERVICE_TYPE IN (100, 0)    
      AND ((MPS_FTR_CD1 = 1033 AND MPS_SWTCH_CD = 'T11')      
            OR MPS_FTR_CD1 = 1031)  
    GROUP BY RECIPIENT
    

    此外,您希望从该 SELECT 中插入那些 COUNT(*) 大于零的记录到另一个表中。这可以通过不使用游标的单个 INSERT 语句来实现,因此具有更好的性能,就像这样

    INSERT INTO TRAFFIC_PREPROCESS_INB
    (TADIG, MOC_LOCAL_CALL_RECORDS)
    SELECT RECIPIENT, COUNT(*) N_CNT       
    FROM ABA_RM_INB_USAGE
    WHERE SERVICE_TYPE IN (100, 0)    
      AND ((MPS_FTR_CD1 = 1033 AND MPS_SWTCH_CD = 'T11')      
            OR MPS_FTR_CD1 = 1031)  
    GROUP BY RECIPIENT
    HAVING N_CNT > 0  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-10
      • 1970-01-01
      • 1970-01-01
      • 2012-05-17
      相关资源
      最近更新 更多