Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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_Sql Server_Sql Server 2008 - Fatal编程技术网

编写SQL查询以查询和更新同一个表

编写SQL查询以查询和更新同一个表,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我对SQL不是很友好,所以我需要在表上编写SQL更新/删除查询。要求如下 表A: Col1(PK)Col2 Col3数量 1代码1 价值15 2代码2值22 3代码1值13 4代码3值38 考虑上表,其中Col2和Col3有多个值相同的行。我想写一个查询,它将删除Col2和Col3的重复组合,并对结果记录的数量求和 结果应该是这样的: Col1(PK)Col2 Col3数量 1代码1 价值18 2代码2值22 4代码3值38使用以下命令: select * from (

我对SQL不是很友好,所以我需要在表上编写SQL更新/删除查询。要求如下

表A:

Col1(PK)Col2 Col3数量 1代码1 价值15 2代码2值22 3代码1值13 4代码3值38 考虑上表,其中Col2和Col3有多个值相同的行。我想写一个查询,它将删除Col2和Col3的重复组合,并对结果记录的数量求和

结果应该是这样的:

Col1(PK)Col2 Col3数量 1代码1 价值18 2代码2值22 4代码3值38使用以下命令:

  select *
    from (select *, sum(Quantity) over (partition by col2,col3) as Quantity
          from tableA
         ) t

一个选项是只选择要放入新表中的结果集,然后删除上一个表:

CREATE TABLE A_new(Col1 INT PRIMARY KEY,
                   Col2 varchar(255),
                   Col3 varchar(255),
                   Quantity INT);

INSERT INTO A_new (Col1, Col2, Col3, Quantity)
SELECT MIN(Col1) AS Col1, Col2, Col3, SUM(Quantity) AS Quantity
FROM A
GROUP BY Col2, Col3
接下来,您可以删除表
A
,并将
A_new
重命名为
A

DROP TABLE A
sp_rename A_New, A

请执行以下查询:

SELECT 
    Col2,
    Col3,
    SUM(Quantity) 
FROM table_1
GROUP BY
    Col2,
    Col3
对于第一个更新步骤(假设表A的名称为表1):

这将使用其数量总和更新具有多行的每一行

然后,您可以删除其代码2具有相同值的同一行:

WITH CTE AS(
   SELECT 
       RN = ROW_NUMBER()OVER(PARTITION BY Col2,Col3 ORDER BY Col2,Col3)
   FROM Table_1
)
DELETE FROM CTE WHERE RN > 1;

对不起,我以为Col2和Col3总是一样的*我编辑了我的发言。如果您获得的数据超过1行,则可以删除除第一行以外的所有数据。

您需要分两部分执行此操作,如果要确保数据的完整性,则应将这两部分包装在事务中

第一部分更新所需行的数量,第二部分删除现在重复的行

BEGIN TRANSACTION

UPDATE TableA
SET Quantity=upd.Quantity
FROM TableA a
INNER JOIN (
    SELECT MIN(Col1) AS Col1, SUM(Quantity)  AS Quantity
    FROM TableA
    GROUP BY Col2, Col3 
) upd
ON a.Col1 = upd.col1

;WITH DELETES
AS
(
  SELECT Col1,ROW_NUMBER() OVER (PARTITION BY Col2,Col3 ORDER BY Col1) rn
  FROM TableA
)
DELETE FROM TableA WHERE Col1 IN (
    SELECT Col1 FROM DELETES WHERE rn>1
)

COMMIT TRANSACTION
实例:


(编辑:更新以修复评论中指出的问题)

我没有投你反对票,你的查询是正确的。也许你可以再解释一下你的推理?这个问题还问了关于更新表的问题,这只是选择了(无可否认,是正确的)数据。@Jamiec,我错过了。我知道JSFIDLE站点。从您的回答中,我了解了sqlfiddle站点。谢谢我没有对数据库的创建/删除权限。我认为@mircac21是正确的,存储过程或事务是这里唯一的希望。如果您在live DB中没有大量记录,则删除/创建不是一个好的做法。作为一次性事件,它是可协商的。我认为不可能在不使用事务或存储的情况下在一个查询中进行插入/更新和删除程序。您如何运行查询(命令行、服务器端语言…?
我对SQL不太友好,这让我咯咯地笑:)您说的话恰好是我说不出来的。您介意解释一下
删除
的工作原理吗?它似乎是递归的。如果您有两个以上的记录具有相同的值,那么它将不起作用。@sm.abdullah-您能解释一下您认为的问题是什么吗?其要点是删除“两条记录具有相同值”的列。最好用我的sqlfiddle作为基础来解释这个问题。@TimBiegeleisen
delete
不是递归的,它只是使用表中列(1,2,3,4)的形式
delete
但在
中的
中使用select子句。示例数据:Col1 Col2 Col3数量1 Code1 Value12 Code2 Value25 Code1 Value14 Code3 Value36 Code1 Value4 delete语句不起作用的原因适当地?在这里工作很好。我还创建了相同的表并进行了尝试。你能再解释一下吗?
BEGIN TRANSACTION

UPDATE TableA
SET Quantity=upd.Quantity
FROM TableA a
INNER JOIN (
    SELECT MIN(Col1) AS Col1, SUM(Quantity)  AS Quantity
    FROM TableA
    GROUP BY Col2, Col3 
) upd
ON a.Col1 = upd.col1

;WITH DELETES
AS
(
  SELECT Col1,ROW_NUMBER() OVER (PARTITION BY Col2,Col3 ORDER BY Col1) rn
  FROM TableA
)
DELETE FROM TableA WHERE Col1 IN (
    SELECT Col1 FROM DELETES WHERE rn>1
)

COMMIT TRANSACTION