如何从SQL服务器中删除所有生成的行,选择A. *查询

时间:2017-03-02 09:09:45

标签: sql-server

我正在尝试从我所做的查询中删除所有结果(根据3个相同的列检测重复项,然后选择行ID最低的列)。

我在SO上发现了一些类似的问题,但我无法将其与将查询结果放入A中一起使用。*

我当前的查询做了我想要的(它可能没有完全优化,但它需要2秒,现在很好),我只需要删除它返回的所有内容。

我尝试在DELETE FROM [myDB].[dbo].[myTable]的行中添加一些内容到查询的开头,但我似乎无法正确理解它。我不确定它是否是语法或逻辑问题。

/* returns the list I want, with a single row of 
all my duplicates based on 3 properties. 
Now I want to delete these rows */

begin tran

SELECT A.*
FROM [myDB].[dbo].[myTable] A
INNER JOIN
  ( SELECT Prop1,
           Prop2,
           [prop 3]
   FROM [myDB].[dbo].[myTable]
   GROUP BY Prop1,
            [prop 3],
            Prop2
   HAVING COUNT(*) > 1) B 
ON A.Prop1= B.Prop1
AND A.Prop2 = B.Prop2
AND A.[prop 3] = B.[prop 3]
WHERE id IN
    (SELECT MIN(id)
     FROM [myDB].[dbo].[myTable]
     GROUP BY Prop1,
              [prop 3],
              Prop2)
ORDER BY [prop 3]
ROLLBACK

编辑:

根据3BK的回答,我很简单地将SELECT更改为DELETE,并将A.*更改为A

工作结果:

begin tran

DELETE A
FROM [myDB].[dbo].[myTable] A
INNER JOIN
  ( SELECT Prop1,
           Prop2,
           [prop 3]
   FROM [myDB].[dbo].[myTable]
   GROUP BY Prop1,
            [prop 3],
            Prop2
   HAVING COUNT(*) > 1) B 
ON A.Prop1= B.Prop1
AND A.Prop2 = B.Prop2
AND A.[prop 3] = B.[prop 3]
WHERE id IN
    (SELECT MIN(id)
     FROM [myDB].[dbo].[myTable]
     GROUP BY Prop1,
              [prop 3],
              Prop2)
ORDER BY [prop 3]
ROLLBACK

3 个答案:

答案 0 :(得分:1)

如果可以SELECT A.*,那么您也可以DELETE A。您创建的JOIN的条件应该只是确保删除的内容只是那些从SELECT返回的行。

我假设您的ROLLBACK是因为您正在测试,所以您只需将SELECT声明复制到DELETE之后,然后检查一下&{ #39; s返回。

祝你好运。

答案 1 :(得分:0)

如果你使用cte:

怎么样?

我已经通过删除记录来尝试cte

;with del_cte as 
(

SELECT A.*
FROM [myDB].[dbo].[myTable] A
INNER JOIN
  ( SELECT Prop1,
           Prop2,
           [prop 3]
   FROM [myDB].[dbo].[myTable]
   GROUP BY Prop1,
            [prop 3],
            Prop2
   HAVING COUNT(*) > 1) B 
ON A.Prop1= B.Prop1
AND A.Prop2 = B.Prop2
AND A.[prop 3] = B.[prop 3]
WHERE id IN
    (SELECT MIN(id)
     FROM [myDB].[dbo].[myTable]
     GROUP BY Prop1,
              [prop 3],
              Prop2)
ORDER BY [prop 3]
)

delete from del_cte

答案 2 :(得分:0)

你试过吗

Delete form tablename where id in ( your query )

希望有所帮助: -

Delete [myDB].[dbo].[myTable]
where id in
(
SELECT id
FROM [myDB].[dbo].[myTable] A
INNER JOIN
  ( SELECT Prop1,
           Prop2,
           [prop 3]
   FROM [myDB].[dbo].[myTable]
   GROUP BY Prop1,
            [prop 3],
            Prop2
   HAVING COUNT(*) > 1) B 
ON A.Prop1= B.Prop1
AND A.Prop2 = B.Prop2
AND A.[prop 3] = B.[prop 3]
WHERE id IN
    (SELECT MIN(id)
     FROM [myDB].[dbo].[myTable]
     GROUP BY Prop1,
              [prop 3],
              Prop2)
)