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
我正在尝试删除 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