මෙය කළ හැකි තවත් ක්රමයක් නම්
;
--Ensure that any immediately preceding statement is terminated with a semicolon above
WITH cte
AS (SELECT ROW_NUMBER() OVER (PARTITION BY Col1, Col2, Col3
ORDER BY ( SELECT 0)) RN
FROM #MyTable)
DELETE FROM cte
WHERE RN > 1;
මා ORDER BY (SELECT 0)
ඉහත භාවිතා කරන්නේ ටයි පටියකදී ආරක්ෂා කර ගත යුතු පේළිය අත්තනෝමතික බැවිනි.
RowID
උදාහරණයක් ලෙස ඔබට භාවිතා කළ හැකි නවතම දේ සංරක්ෂණය කිරීමORDER BY RowID DESC
ක්රියාත්මක කිරීමේ සැලසුම්
මේ සඳහා ක්රියාත්මක කිරීමේ සැලැස්ම බොහෝ විට පිළිගත් පිළිතුරට වඩා සරල හා කාර්යක්ෂම වන්නේ එයට ස්වයං සම්බන්ධ වීම අවශ්ය නොවන බැවිනි.
කෙසේ වෙතත් මෙය සැමවිටම එසේ නොවේ. GROUP BY
විසඳුමට වැඩි කැමැත්තක් දැක්විය හැකි එක් ස්ථානයක් වන්නේ ධාරා සමස්ථයකට වඩා හැෂ් එකතුවක් තෝරා ගැනීමයි.
මෙම ROW_NUMBER
වන ෙහයින් ද විසඳුමක් සෑම විටම එකම සැලැස්මක් එච්චරමයි දෙනවා GROUP BY
උපාය වඩාත් නම්යශීලී වේ.
හැෂ් සමස්ථ ප්රවේශයට හිතකර සාධක වනු ඇත
- කොටස් කිරීමේ තීරුවල ප්රයෝජනවත් දර්ශකයක් නොමැත
- එක් එක් කාණ්ඩයේ සාපේක්ෂව වැඩි අනුපිටපත් ඇති සාපේක්ෂව අඩු කණ්ඩායම්
මෙම දෙවන නඩුවේ ආන්තික අනුවාද වලදී (එක් එක් අනුපිටපත් සහිත කණ්ඩායම් ඉතා ස්වල්පයක් තිබේ නම්) යමෙකුට නව වගුවක තබා ගැනීම සඳහා පේළි ඇතුළත් කිරීම ගැන සලකා බැලිය හැකිය - ඉන්පසු TRUNCATE
මුල් පිටපත මකාදැමීමට සාපේක්ෂව ලොග් වීම අවම කිරීම සඳහා ඒවා නැවත පිටපත් කිරීම. පේළි ඉතා ඉහළ අනුපාතය.
DELETE FROM
වූ CTE කාලීන සෘජුවම. Stackoverflow.com/q/18439054/398670