【问题标题】:Multiple insert based on value of a field?基于字段值的多次插入?
【发布时间】:2013-09-19 15:44:48
【问题描述】:

我有一张桌子 t1:

ID    Period
---  --------
1       5
2       3
3       2

(该表实际上有 366 个不同的 ID,它们的周期可以是 23、24 或 25。)

我想在表 t2 中插入多行,其中包含字段 ID 和 Hour,其中 Hour(ID) in 1 ..Period(ID):

ID    Hour
---  -----
1     1
1     2
1     3
1     4
1     5
2     1
2     2
2     3
3     1
3     2

我该怎么做?

【问题讨论】:

    标签: sql oracle insert


    【解决方案1】:

    您可以通过使用model 子句来实现这一点,例如:

    with t1(ID, Period) as(
      select 1, 5 from dual union all
      select 2, 3 from dual union all
      select 3, 2 from dual
    )
    select ID
         , period as hour
      from t1
      model
      partition by (ID)
      dimension by (1 as indx)
      measures(period)
      rules(
         period[for indx from 1 to period[1] increment 1] = cv(indx)
      )
    

    SQLFiddle Demo

    结果:

            ID      HOUR
    ---------- ----------
             1          1 
             1          2 
             1          3 
             1          4 
             1          5 
             2          1 
             2          2 
             2          3 
             3          1 
             3          2 
    
     10 rows selected 
    

    您的insert 声明可能如下所示:

    insert into t2(id, hour)
       select ID
            , period
         from t1
         model
         partition by (ID)
         dimension by (1 as indx)
         measures(period)
         rules(
            period[for indx from 1 to period[1] increment 1] = cv(indx)
         )
    

    【讨论】:

    • 问题是这里的例子比我有366个ID的真实表要小。我希望存在一种不需要每个 ID 进行“选择”的方法。
    • @user1777530 exists a way that does not need a "select" per ID。我不确定我是否在关注。你能详细说明一下吗?你的桌子有多大并不重要。也许是 with 子句让您感到困惑。它只是为了演示而存在。你不需要它。
    • 好的。我对 SQL 几乎一无所知。因此,不需要“with”子句。然后,我想它对我来说很好用。谢谢。
    • @user1777530 是什么阻止了你?只需在查询的选择列表中添加常量值即可。
    • 我使用 Oracle SQL Developer。当我尝试上面的代码时,出现“无法将 NULL 插入 (%s)”错误。我想插入命令有些东西。我试过“插入 t2(id, hour) VALUES (select ID, period from t1)”,但同样的错误信息。
    【解决方案2】:

    测试设置:

    CREATE TABLE t1 (
        ID INT PRIMARY KEY,
        Period INT NOT NULL
    );
    
    CREATE TABLE t2 (
        ID INT NOT NULL,
        Hour INT NOT NULL
        -- There would also be a PK here in real life.
    );
    
    INSERT INTO t1 VALUES (1, 5);
    INSERT INTO t1 VALUES (2, 3);
    INSERT INTO t1 VALUES (3, 2);
    

    实际插入:

    INSERT INTO t2
    WITH CTE (ID, Hour) AS (
        SELECT ID, Period FROM t1
        UNION ALL
        SELECT ID, Hour - 1 FROM CTE WHERE Hour > 1
    )
    SELECT * FROM CTE;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-04
      • 1970-01-01
      • 2012-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-01
      • 1970-01-01
      相关资源
      最近更新 更多