【问题标题】:Select insert with sequence and distinct选择具有序列和不同的插入
【发布时间】:2015-07-08 14:43:59
【问题描述】:

我正在尝试在需要使用序列和不同子句的地方执行选择插入。

我知道我们不能使用具有 distinct 的序列,所以我在 FROM 中嵌套了一个子查询,如下所示:

INSERT INTO  SchemaName.XXSON_ST_B2B_CTR_PRICING
(SEQ_NO,SEEB_KEY,MESSAGE_ID,MESSAGE_TYPE,CREATE_DTIME,CHANGE_DTIME,STATUS)
   SELECT
          XXSON.XXSON_B2B_CTR_PRICING_SEQ.NEXTVAL   AS SEQ_NO,
         'SESS_NO'          AS SEEB_KEY,
          srp.ITEM          AS MESSAGE_ID,
         'MESSAGE_TYPE'     AS MESSAGE_TYPE,
          sysdate           AS CREATE_DTIME,
          sysdate           AS CHANGE_DTIME,
          'I'               AS STATUS
   FROM 
     (SELECT distinct srp.ITEM
      FROM  SchemaName.NB_PRICELIST_CTRL pctrl,
            SchemaName.NB_PRICELIST_SRP srp
      WHERE STATUS = 'W'
      AND SOURCE_TABLE = 'NB_PRICELIST_SRP');

但是,有了这个,我无法将 srp.ITEM 作为 MESSAGE_ID 插入,因为我有一个无效的标识符 (ORA-00904),这并不奇怪。有什么解决方法可以让我正确插入吗?

【问题讨论】:

  • 如何在没有样本数据的情况下重现您的问题?请提供创建和插入语句。至少一个 SQL Fiddle。

标签: sql oracle select insert distinct


【解决方案1】:

要摆脱ORA-00904: invalid identifier srp.ITEM,您必须将alias 分配给derived table,该derived table 用作存储在内存中的普通表。在块内分配的FROM 子句中的别名在块外不可见。

INSERT INTO  SchemaName.XXSON_ST_B2B_CTR_PRICING
    (SEQ_NO,SEEB_KEY,MESSAGE_ID,MESSAGE_TYPE,CREATE_DTIME,CHANGE_DTIME,STATUS)
        SELECT
                XXSON.XXSON_B2B_CTR_PRICING_SEQ.NEXTVAL   AS SEQ_NO,
                'SESS_NO'          AS SEEB_KEY,
                alias.ITEM          AS MESSAGE_ID,
                'MESSAGE_TYPE'     AS MESSAGE_TYPE,
                sysdate           AS CREATE_DTIME,
                sysdate           AS CHANGE_DTIME,
                'I'               AS STATUS
        FROM 
        (SELECT distinct srp.ITEM
            FROM  SchemaName.NB_PRICELIST_CTRL pctrl,
                    SchemaName.NB_PRICELIST_SRP srp
            WHERE STATUS = 'W'
            AND SOURCE_TABLE = 'NB_PRICELIST_SRP') alias;

【讨论】:

    【解决方案2】:

    请尝试以下查询,这可能会对您有所帮助。

    插入到 SchemaName.XXSON_ST_B2B_CTR_PRICING (SEQ_NO,SEEB_KEY,MESSAGE_ID,MESSAGE_TYPE,CREATE_DTIME,CHANGE_DTIME,STATUS) 选择 XXSON.XXSON_B2B_CTR_PRICING_SEQ.NEXTVAL AS SEQ_NO, 'SESS_NO' 作为 SEEB_KEY, (从 SchemaName.NB_PRICELIST_CTRL pctrl、SchemaName.NB_PRICELIST_SRP srp 中选择不同的 srp.ITEM,其中 STATUS = 'W' AND SOURCE_TABLE = 'NB_PRICELIST_SRP')作为 MESSAGE_ID, 'MESSAGE_TYPE' 作为 MESSAGE_TYPE, sysdate 作为 CREATE_DTIME, sysdate 作为 CHANGE_DTIME, “我”作为状态;

    问候。

    【讨论】:

      【解决方案3】:

      您提供的错误消息涉及缺少或无效的列。我认为错误消息的具体问题是

      中的 srp 别名
      srp.item as Message_ID
      

      因为您没有为括号中的 2 个表的组合加上别名(您为里面的各个表加上了别名,但这并没有被执行)。一个简单的解决方法是删除“srp”。从顶部语句中“item”的前面开始。

      INSERT INTO  SchemaName.XXSON_ST_B2B_CTR_PRICING
      (SEQ_NO,SEEB_KEY,MESSAGE_ID,MESSAGE_TYPE,CREATE_DTIME,CHANGE_DTIME,STATUS)
         SELECT
                XXSON.XXSON_B2B_CTR_PRICING_SEQ.NEXTVAL   AS SEQ_NO,
               'SESS_NO'          AS SEEB_KEY,
                ITEM          AS MESSAGE_ID,
               'MESSAGE_TYPE'     AS MESSAGE_TYPE,
                sysdate           AS CREATE_DTIME,
                sysdate           AS CHANGE_DTIME,
                'I'               AS STATUS
         FROM 
           (SELECT distinct srp.ITEM
            FROM SchemaName.NB_PRICELIST_CTRL pctrl,
              SchemaName.NB_PRICELIST_SRP srp
            WHERE STATUS = 'W'
            AND SOURCE_TABLE = 'NB_PRICELIST_SRP')
      

      另外,我不太了解包含 pctrl。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-20
        • 2019-03-22
        • 1970-01-01
        • 2015-11-17
        • 1970-01-01
        • 2011-03-31
        • 2017-12-24
        相关资源
        最近更新 更多