代码之家  ›  专栏  ›  技术社区  ›  VoodooChild

sql在一个表上多次插入,而在另一个表上循环/迭代?

  •  4
  • VoodooChild  · 技术社区  · 14 年前

    “TempStore”表中有数据,我需要将其移到“Store”表中,该表只需要很少的修改。

    我需要迭代“TempStore”数据(即项)并插入到存储中。。。

    4 回复  |  直到 7 年前
        1
  •  9
  •   KM.    14 年前

    尝试插入选择:

    INSERT INTO Store
            (col1, col2, col3...)
        SELECT
            col1, col2, col3...
            FROM TempStore
            WHERE ...
    

    只需让SELECT为每个insert返回一行,并在Cols中生成所需的值。你可能需要 CASE

    编辑 根据评论,OP希望看到数字表在起作用

    假设TempStore表有{项, 成本、价格、实际成本、实际价格} 但是在商店的桌子上我需要储存 {项目,成本,价格}。实际成本 以及TempStore数据行的实际价格 店内……(我希望这能 使用“WHILE-BEGIN-END”??

    CREATE TABLE Numbers (Number int NOT NULL PRIMARY KEY)
    INSERT INTO Numbers VALUES(1)
    INSERT INTO Numbers VALUES(2)
    INSERT INTO Numbers VALUES(3)
    
    
    INSERT INTO Store
            (Items, Cost, Price)
        SELECT
            t.Items, t.Cost
                ,CASE
                     WHEN n.Number=1 THEN t.Price
                     WHEN n.Number=2 THEN t.ActualCost
                     ELSE t.ActualPrice
                 END
            FROM TempStore         t
                INNER JOIN Numbers N ON n.Number<=3
            WHERE ...
    

    INSERT INTO Store
            (Items, Cost, Price)
        SELECT
            t.Items, t.Cost, t.Price
            FROM TempStore t
        UNION ALL
        SELECT
            t.Items, t.Cost, t.ActualCost
            FROM TempStore t
        UNION ALL
        SELECT
            t.Items, t.Cost, t.ActualPrice
            FROM TempStore t
    

    方式 总比循环好!

        2
  •  3
  •   DOK    14 年前

    围绕INSERT-SELECT使用WHILE-BEGIN-END。

    存储区有StoreID、StoreName、StoreState和StoreNumber列。

    我用值First、Second、Third和Fourth预先填充了TempStoreName。

    现在,对于TempStore表中满足WHERE子句条件的每条记录,SQL将向Store表中插入三条记录。这个条件是TempStoreName的长度,显然不是一个真实的例子。

    DECLARE @counter int 
    SET @counter = 0;
    WHILE @counter < 3
    BEGIN
    INSERT INTO Store (StoreName, StoreState, StoreNumber)
        SELECT TempStoreName, 'AZ', @counter FROM TempStore WHERE LEN(TempStoreName) = 5
    SET @counter = @counter + 1
    END
    

    StoreID StoreName   StoreState  StoreNumber
    1           First       AZ          0
    2           First       AZ          1
    3           First       AZ          2
    4           Third       AZ          0
    5           Third       AZ          1
    6           Third       AZ          2
    

    所以,这种方法是有效的。它似乎满足了伏都教的需要。这也许是最好的选择,也可能不是,但我们不知道这个决定还涉及到其他因素,比如这个操作要重复多少次。

        3
  •  1
  •   Alex W    14 年前
    INSERT INTO Store ( SELECT * FROM TempStore UNION ALL SELECT * FROM TempStore )
    

        4
  •  1
  •   Tom H zenazn    14 年前

    鉴于你最近的评论,这应该给你你需要的。一旦Stores表中的值到达那里,您应该有一些方法来区分它们。可能是“实际”位列或类似的内容:

    INSERT INTO Stores (item, cost, price, actual)
    SELECT item, cost, price, 0
    FROM TempStores
    UNION ALL
    SELECT item, actual_cost, actual_price, 1
    FROM TempStores
    

    INSERT INTO Stores (item, cost, price, actual)
    SELECT item, cost, price, 0
    FROM TempStores
    UNION ALL
    SELECT item, actual_cost, 1.1 * actual_price, 1
    FROM TempStores
    WHERE actual_cost IS NOT NULL
    

    我还向第二个SELECT语句添加了WHERE子句,以显示您可以过滤行。WHERE子句只会影响第二个SELECT。所以,你也可以这样做:

    INSERT INTO Stores (item, cost, price, actual)
    SELECT item, cost, price, 0
    FROM TempStores
    WHERE cost IS NOT NULL
    UNION ALL
    SELECT item, actual_cost, 1.1 * actual_price, 1
    FROM TempStores
    WHERE actual_cost IS NOT NULL