Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql在一个表上多次插入,而在另一个表上循环/迭代?_Sql_Database_Sybase - Fatal编程技术网

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

sql在一个表上多次插入,而在另一个表上循环/迭代?,sql,database,sybase,Sql,Database,Sybase,我有两个表“TempStore”和“Store”,它们的同一列叫做“Items” “TempStore”表中有数据,我需要将其移到“Store”表中,该表只需要很少的修改 我需要迭代“TempStore”数据(即项)并将其插入存储 更具体地说:我如何迭代TempStore(在sql中),“对于'TempStore'中的每个项目,我需要在'store'中存储2个或3个项目,只需稍加修改”,我如何实现这一点 我要做的是从“[SELECT*from TempStore]”中获取每行数据,并在“Stor

我有两个表“TempStore”和“Store”,它们的同一列叫做“Items”

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

我需要迭代“TempStore”数据(即项)并将其插入存储

更具体地说:我如何迭代TempStore(在sql中),“对于'TempStore'中的每个项目,我需要在'store'中存储2个或3个项目,只需稍加修改”,我如何实现这一点


我要做的是从“[SELECT*from TempStore]”中获取每行数据,并在“Store”中插入三条记录,同时可以更改“items”

尝试插入选择:

INSERT INTO Store
        (col1, col2, col3...)
    SELECT
        col1, col2, col3...
        FROM TempStore
        WHERE ...
只需使SELECT为每个insert返回一行,并在COL中生成所需的值。您可能需要
CASE
和一个到另一个表的连接来生成额外的行

编辑根据评论,OP希望查看正在运行的数字表


假设TempStore表有{项, 成本、价格、实际成本、实际价格} 但在存储表中,我需要存储 {项目、成本、价格}。实际成本 以及TempStore数据行中的实际价格 将需要添加为另一行 在商店里……(我希望这能让你满意 不管怎样,这就是解决办法 使用“WHILE-BEGIN-END”

无论是数字表还是联合,我们都比循环更好

INSERT INTO Store ( SELECT * FROM TempStore UNION ALL SELECT * FROM TempStore )

上述语句将在存储区中为TempStore中的每一行插入两行。您可以将SELECT*更改为您想要对项目进行的任何修改。

好的,我认为KM提出了一个涉及“数字表”的优秀解决方案。然而,伏都教在一篇评论中要求我发布示例代码,以支持我的建议,即在INSERT-SELECT中使用WHILE-BEGIN-END。

我已经创建了两个表,如伏都教商店和临时商店

Store有StoreID、StoreName、StoreState和StoreNumber列

TempStore有TempStoreID和TempStoreName列

我用值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

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

根据您最近的评论,这应该能满足您的需要。一旦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
如果需要调整列(例如,将实际价格提高10%),则可以执行以下操作:

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

@你确定是MS-SQL吗?我不知道sybase是什么,它使用什么样的sql?@KM:谢谢-这很好,但是我如何才能在存储中为TempStore中的每个rowdata插入3条记录?只运行sql语句三次怎么样?或者,若要重复此操作,请将INSERT-SELECT包装在WHILE-BEGIN-END中。@VoodooChild,创建一个数字表:您可以将TempStore加入其中。创建数字表后,将其添加到N上的选择:
内部连接数字N。Number@DOK,如果不需要,请不要循环,基于集合是进入数据库的最快和最好的方式我要做的是从“[SELECT*from TempStore]”中获取每行数据,并在“Store”中插入三条记录,同时能够更改“items”.你应该更具体地说明一行如何变成三行。理想情况下,包括示例数据和预期结果。假设TempStore表有{Items,Cost,Price,ActualCost,ActualPrice},但在Store表中我需要存储{Items,Cost,Price}。TempStore datarow中的ActualCost和ActualPrice需要添加为Store中的另一行…(我希望这有意义)…无论如何,解决方案是否使用“WHILE-BEGIN-END”?+1 Hmm,这很有趣。我想我可以继续使用“UNIONALL”进行我想要的迭代次数,只要表相同,select就可以工作。这种方法的唯一问题是,例如,上面我将得到两个要插入的数据,但我无法编辑要插入的数据…或者我不知道如何插入?请大家多多指教,谢谢!只要列数据类型匹配,select就可以工作。它们可能来自不同的桌子。我不知道你说的“编辑”到底是什么意思。您当然可以在上面的列上使用函数。我将添加一个简短的示例。+1,感谢您执行我的请求。嗯,如果你觉得无聊:p你可以根据“数字表”发布另一个答案,如果不是,那么我仍然认为你很棒。哎呀,我看到KM已经用数字表更新了他的答案……我将看看哪个答案更有意义。非常感谢你们的帮助,你们真是太棒了awesome@VoodooChild所以在这里对你来说真的很好。您可以选择两种非常好的方法。我认为KM的解决方案更优雅,如果它对你有效的话。是的,我刚刚在我的实际解决方案中尝试了数字表方法,它比循环更有效,而且它很容易遵循——我很高兴看到它,它的效果非常完美。再次非常感谢,非常感谢您的帮助。干杯:)
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
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