Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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 server MS Sql-根据另一个表的内容更新X行数_Sql Server_Sql Update - Fatal编程技术网

Sql server MS Sql-根据另一个表的内容更新X行数

Sql server MS Sql-根据另一个表的内容更新X行数,sql-server,sql-update,Sql Server,Sql Update,我有两个表,例如表1和表2 表1包含100个条目,其结构如下: id (int), count(int), code(varchar(50)) id (int), code(varchar(50)) 表2包含数千行,其结构如下: id (int), count(int), code(varchar(50)) id (int), code(varchar(50)) 我需要在表1上进行选择,选择所有行和所有数据,然后切换到表2并将代码复制到X行数。其中X是从表1中提取的数字 因此,例如,如果

我有两个表,例如表1和表2

表1包含100个条目,其结构如下:

id (int), count(int), code(varchar(50))
id (int), code(varchar(50))
表2包含数千行,其结构如下:

id (int), count(int), code(varchar(50))
id (int), code(varchar(50))
我需要在表1上进行选择,选择所有行和所有数据,然后切换到表2并将代码复制到X行数。其中X是从表1中提取的数字

因此,例如,如果表1包含第1,17行abc123和第2,26行cde456,则应使用代码abc123更新表2的前17行,并使用cde456更新接下来的26行

这可以通过查询来完成,还是必须通过专用软件来完成

编辑:

它不能正常工作。这是我目前测试的结果,与下面的答案相去甚远:

WITH Grps AS(
SELECT LAG([qty],1,1) OVER (ORDER BY timecol ASC) AS CountStart,
       [qty] AS CountEnd,
       sscc,
       ROW_NUMBER() OVER (ORDER BY timecol asc) AS RN
FROM QtyInfo),
CTE AS(
SELECT id,
       sscc,
       ROW_NUMBER() OVER (ORDER BY id asc) AS RN
FROM CrateCodes)
UPDATE C
SET sscc = G.sscc
FROM CTE C
 JOIN Grps G ON C.RN BETWEEN G.CountStart AND G.CountEnd  where G.RN < 10;

这可能就是你想要的:

创建表dbo.Table1 ID int IDENTITY, [Count]int, 代码varchar6; 去 创建表dbo.Table2 ID int IDENTITY, 代码varchar6; 去 插入到dbo.Table1中 值5,'abc123',3,'def456'; 去 插入到dbo.Table2中 valuesnall,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL; 去 以GRP作为 在无界前置和1前置之间的ORDER BY ID ASC行上选择ISNULLSUM[Count],1作为CountStart, 按ID ASC对订单求和[Count]作为CountEnd, 密码 从表1中, CTE AS 选择ID, 密码 按ID为RN的订单上的行号 来自表2 更新C 设置代码=G.代码 来自CTE C 在G.CountStart和G.CountEnd之间连接C.RN上的GRP G; 去 挑选* 来自dbo.表2; 去 删除表dbo.Table1; 删除表dbo.Table2;
使用可更新的CTE可以很容易地实现这一点。到目前为止你都试了些什么,为什么不奏效?我不知道从哪里开始,所以我什么都没试过。但是如果你能给我指出正确的方向,我可以在表2中测试,更新总是从第0行开始。因此,它不断地覆盖相同的行。这是什么意思?更新第1-10行时,您还希望看到什么?当然,它会更新这些行。在上面的示例中,表1的第一个条目的count=17,第二个条目的count=26。。所以我希望在表2中,前17行包含代码abc123,接下来的26行包含cde456。目前在表2中,前17行包含abc123,然后它们被cde456覆盖,因为不再从18行开始继续,而是从第0行开始,示例数据将帮助我们帮助您。谢谢。。我正在努力理解代码。。。更新C和G代码,如何定义C和G?查询当前已运行了2分钟。是否仅限于表1的前10行进行测试?C和G是CTE C和JOIN Grps G的别名@sharkyenergy。是否仅限于表1的前10行进行测试?是的,只需在RN上添加一个WHERE。RN不是表2的一部分吗??我想我误解了你的代码。。