SQL 当使用不存在的地方和 select 不同的子查询时,行不会从 table 中删除
SQL Rows are not deleted from table when using where not exists and select distinct subquery
我是 SQL 的新手,无法找到我做错了什么。我正在尝试删除在 2 个特定列中与其他行在同一 table 中具有匹配字段的行,以获得临时 table,以便只有一行保留相同的 ID 和年份,以便剩下的行是那一年那些 ID 的最大日期。
My table:
ID Year Date
----------------------------------------------------
1 2017 01/05/2017
1 2017 11/17/2017
1 2017 08/07/2017
1 2016 03/22/2017
1 2016 04/01/2017
2 2017 03/12/2017
2 2016 02/03/2016
2 2016 04/19/2016
期望的结果:
ID Year Date
----------------------------------------------------
1 2017 11/17/2017
1 2016 04/01/2016
2 2017 03/12/2017
2 2016 04/19/2016
我有:
DELETE FROM #Temp
WHERE NOT EXISTS (
SELECT DISTINCT
t1.ID,
t1.Year
FROM #Temp AS t1,
#Temp AS t2
WHERE t1.ID = t2.ID
AND t1.Year <> t2.Year
GROUP BY t1.ID, t1.Year )
当我 运行 它时,没有任何内容被删除,但是当我删除前两行以测试将被删除的内容时,结果是正确的,所以我真的很困惑。我正在研究 MAX 函数,但希望这部分先起作用。
如有任何帮助,我们将不胜感激!我不知道它有什么问题。
with cte as
(
select row_number() over (partition by ID, Year order by date desc) as rn
)
delete * from cte where rn > 1;
另一种方法是使用 row_number()
函数根据 ID
.. Year
查找重复记录
delete t from
(
select *, row_number() over (partition by ID, [Year] order by date desc) rn from <table>
) t where t.rn > 1
我是 SQL 的新手,无法找到我做错了什么。我正在尝试删除在 2 个特定列中与其他行在同一 table 中具有匹配字段的行,以获得临时 table,以便只有一行保留相同的 ID 和年份,以便剩下的行是那一年那些 ID 的最大日期。
My table:
ID Year Date
----------------------------------------------------
1 2017 01/05/2017
1 2017 11/17/2017
1 2017 08/07/2017
1 2016 03/22/2017
1 2016 04/01/2017
2 2017 03/12/2017
2 2016 02/03/2016
2 2016 04/19/2016
期望的结果:
ID Year Date
----------------------------------------------------
1 2017 11/17/2017
1 2016 04/01/2016
2 2017 03/12/2017
2 2016 04/19/2016
我有:
DELETE FROM #Temp
WHERE NOT EXISTS (
SELECT DISTINCT
t1.ID,
t1.Year
FROM #Temp AS t1,
#Temp AS t2
WHERE t1.ID = t2.ID
AND t1.Year <> t2.Year
GROUP BY t1.ID, t1.Year )
当我 运行 它时,没有任何内容被删除,但是当我删除前两行以测试将被删除的内容时,结果是正确的,所以我真的很困惑。我正在研究 MAX 函数,但希望这部分先起作用。
如有任何帮助,我们将不胜感激!我不知道它有什么问题。
with cte as
(
select row_number() over (partition by ID, Year order by date desc) as rn
)
delete * from cte where rn > 1;
另一种方法是使用 row_number()
函数根据 ID
.. Year
delete t from
(
select *, row_number() over (partition by ID, [Year] order by date desc) rn from <table>
) t where t.rn > 1