【问题标题】:Insert rows based on number of distinct values in another table in SQL根据 SQL 中另一个表中不同值的数量插入行
【发布时间】:2023-03-17 08:40:02
【问题描述】:

我有一个包含 PO#、Days_to_travel 和 Days_warehouse 字段的表。我将表中不同的 Days_in_warehouse 值插入到临时表中。我想要一个脚本,它将临时表中 Days_in_warehouse 字段中的所有值插入到表 1 中的 Days_in_warehouse_batch 行中,通过 PO# 复制 PO 记录,直到所有 PO 具有每个不同值的记录。 例子: 临时表:(仅包含表 1 中所有不同值的一个字段)

Days_in_warehouse  
      20
      30
      40

表 1:

PO#  Days_to_travel Days_in_warehouse  Days_in_warehouse_batch
1        10              20             
2         5              30
3         7              40

更新表一:

PO#  Days_to_travel Days_in_warehouse  Days_in_warehouse_batch
1        10              20                    20
1        10              20                    30
1        10              20                    40
2         5              30                    20
2         5              30                    30
2         5              30                    40
3         7              40                    20
3         7              40                    30
3         7              40                    40

关于如何更新表 1 以查看所需结果的任何想法?

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    没有 TEMP 表和 DELETE 的另一种方法。

    UPDATE T SET [Days_in_warehouse_batch] = [Days_in_warehouse];
    
    INSERT INTO T ([PO], [Days_to_travel], 
                   [Days_in_warehouse], [Days_in_warehouse_batch]) 
        SELECT T.PO, 
               T.Days_to_travel,
               T.Days_in_warehouse,
               DAYS_Table.Days_in_warehouse
        FROM T
        CROSS JOIN 
              (SELECT DISTINCT Days_in_warehouse FROM T) as DAYS_Table
        WHERE T.Days_in_warehouse <> DAYS_Table.Days_in_warehouse;
    

    SQLFiddle demo

    【讨论】:

      【解决方案2】:

      我建议如下:

      insert into table1(PO#, Days_to_travel, Days_in_warehouse, Days_in_warehouse_batch)
          select PO#, Days_to_travel, Days_in_warehouse, Days_in_warehouse
          from table1 cross join
               (select 20 as Days_in_warehouse union all select 30 union all select 40) var
          where Days_in_warehouse_batch is null;
      
      delete from table1
          where Days_in_warehouse_batch is null;
      

      【讨论】:

        【解决方案3】:

        您要查找的是两个表之间的cartesian product

        select t1.po, t1.daystotravel, t1.daysinwarehouse, temp.daysinwarehousebatch
        from table1 t1, temp
        

        我能想到用这些值更新 table1 的最简单方法是插入它们,然后删除原始值。

        insert into table1     
        select t1.po, t1.daystotravel, t1.daysinwarehouse, temp.daysinwarehousebatch
        from table1 t1, temp
        

        然后删除原件:

        delete from table1 where daysinwarehousebatch is null
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多