我正在尝试从我所做的查询中删除所有结果(根据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
答案 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)
)