SQL 删除多个表分组的记录

SQL deleting records with group by multiple tables

我正在尝试删除 table 中的重复记录,但如果它们与另一个记录重复。

以下查询获取每个 'bodyshop' 的重复记录数。 我正在尝试删除每个车身修理厂的多张发票。

SELECT
    inv.InvoiceNo, job.BodyshopId, COUNT(*)
FROM
    [Test].[dbo].[Invoices] as inv
  join [Test].[dbo].Repairs as rep on rep.Id = inv.RepairId
  join [Test].[dbo].Jobs as job on job.Id = rep.JobsId
GROUP BY
    inv.InvoiceNo, job.BodyshopId
HAVING 
    COUNT(*) > 1

我希望删除每个车身修理厂的重复发票编号,但我确实希望保留原始发票编号。

InvoiceNo   BodyshopId  (No column name)
29737        16          2
29987        16          3
30059        16          2
23491        139         2
23608        139         3
23867        139         4
23952        139         3

我只希望发票号 29737 对 bodyshopid 16 等一次

希望有道理

谢谢

您可以 运行 以下内容,因为两条记录相同,因此,Group by 将 return 同一发票的单行:

DELETE FROM inv where id not in (
SELECT Max(inv.id) FROM (
SELECT
    inv.id, inv.InvoiceNo, job.BodyshopId, COUNT(*)
FROM
    [Test].[dbo].[Invoices] as inv
  join [Test].[dbo].Repairs as rep on rep.Id = inv.RepairId
  join [Test].[dbo].Jobs as job on job.Id = rep.JobsId
GROUP BY
    inv.InvoiceNo, job.BodyshopId
HAVING 
    COUNT(*) > 1
) TMP_TABLE )

id为主键。

一般SQL。如果 sql-server 需要,请修改。

也许是这样:

with cte as (
SELECT
    inv.ID, inv.InvoiceNo, job.BodyshopId, rn = row_number() over (partition by inv.InvoiceNo, job.BodyshopId order by inv.InvoiceNo, job.BodyshopId)
FROM
    [Test].[dbo].[Invoices] as inv
  join [Test].[dbo].Repairs as rep on rep.Id = inv.RepairId
  join [Test].[dbo].Jobs as job on job.Id = rep.JobsId
)

delete t1
from [Test].[dbo].[Invoices] t1 inner join cte t2 on t1.ID = t2.ID 
where t2.rn > 1

编辑 1 - 您的评论是正确的。所以一个解决方案是在发票中添加一个标识列table。我已经调整了我的查询。

添加/删除标识列:

 alter table [Test].[dbo].[Invoices]  id int identity(1,1)
 drop  column id