Portál AbcLinuxu, 6. května 2025 09:28

Dotaz: Postgre a mazání duplicit pomocí common table expressions

2.11.2010 08:06 jeleniste | skóre: 13 | blog: Prokustovo lože
Postgre a mazání duplicit pomocí common table expressions
Přečteno: 337×
Odpovědět | Admin
Mám následující problém: Na MSSQL s úspěchem používám: ; with cte as ( select *, row_number() over(order by id, partition by id, a, b, c) pid from table )

delete from cte where pid!=0;

--finta obslehnuta z netu, zdroj si nepamatuju

Je to idealni na odstaraneni dupli zaznamu (napriklad opakovane spusteny insert) Na postgre mi to nefunguje, nechce me dovolit mazat z cte

Pominme, ze mam mit v tabulce Pk, kterej mi nedovoli vlozit 2X tyz zaznam a ze nejdou veci takhle prenaset mezi ruznejma SQL serverama.

Jde to nejak obejít, dá se v pg nejak mazat z cte??

Dík Je.
Nejsem blbý, jen se hloupě ptám

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

2.11.2010 08:20 jos
Rozbalit Rozbalit vše Re: Postgre a mazání duplicit pomocí common table expressions
Odpovědět | | Sbalit | Link | Blokovat | Admin
ještě to tam přijoinovat?
with cte as (
  select id, row_number() over(order by id, partition by id, a, b, c) pid
  from table
)
delete t
from table as t
inner join cte on cte.id = t.id
where pid <> 0;
btw to cte je tam zbytečný
delete t
from table as t
inner join (
  select id, row_number() over(order by id, partition by id, a, b, c) pid
  from table
) as x on x.id = t.id
where x.pid <> 1
2.11.2010 09:21 jeleniste | skóre: 13 | blog: Prokustovo lože
Rozbalit Rozbalit vše Re: Postgre a mazání duplicit pomocí common table expressions
Bezva, dík za snahu.

Chm, jestli to chápu, tak si moc nepomůžu, u dupli záznamů je id furt to samý, tj, když to připojim, tak ty záznamy smáznu oba. Tudy cesta nevede.

Je.
Nejsem blbý, jen se hloupě ptám
2.11.2010 09:37 jos
Rozbalit Rozbalit vše Re: Postgre a mazání duplicit pomocí common table expressions
jo aha, sorry, to mi nedošlo
2.11.2010 09:43 jeleniste | skóre: 13 | blog: Prokustovo lože
Rozbalit Rozbalit vše Re: Postgre a mazání duplicit pomocí common table expressions
V poho, nepustil sem to do vostrejch dat :)
Nejsem blbý, jen se hloupě ptám
2.11.2010 10:30 jos
Rozbalit Rozbalit vše Re: Postgre a mazání duplicit pomocí common table expressions
V poho, nepustil sem to do vostrejch dat :)
bez rollbacku ani ránu )

druhej pokus:
delete t
from table as t
inner join (
  select id, row_number() over(order by id, partition by id, a, b, c) pid
  from table
) as x on x.id = t.id
inner join (
  select id, row_number() over(order by id, partition by id, a, b, c) pid
  from table
) as y on y.id = x.id and y.pid < x.pid
where y.pid <> 0
za předpokladu, že databáze ví který (fyzický) záznamy to vlastně joinuje (na MSSQL se mi to experimentálně potvrdit nepodařilo, ale asi dělam něco blbě)

takže řešením (bez OIDů a CTIDů) by bylo přidat soupec, oupdatovat pomocí ROW_NUMBER a pak nemazat nejnižší hodnotu
2.11.2010 10:49 jeleniste | skóre: 13 | blog: Prokustovo lože
Rozbalit Rozbalit vše Re: Postgre a mazání duplicit pomocí common table expressions
takže řešením (bez OIDů a CTIDů) by bylo přidat soupec, oupdatovat pomocí ROW_NUMBER a pak nemazat nejnižší hodnotu

Mě použití OIDů a CTIDů nevadí. Celej prblm se točí kolem unikátního označení záznamu, který v MSSQL neni. Na tom řešení s cte je elegantní, právě to, že se žádnej sloupec nemusí přidávat, tim, že se maže z CTE. Já bych opustil prblm s duplicitama, způsobů, jak ho pořešit, je evidentně celá přehršel. Spíš mě zajímá rozdíl v možnostech CTE v POSTGRESQL a MSSQL, konkrétně proč to v tom POSTGRE nejde, jde někde povolit v POSTGRE mazání z CTE?? Tenhle konkrétní příklad je v zásadě blbej, protože v podstatě jde o sofistikované řešení prblmu, kterej se na Postgre nevyskytuje, protože má unikátně identifikovatelný řádky sám o sobě.

Nicméně mazání z CTE mi přijde jako poměrně elegantní fičura, která má i jiný využití, než mazání duplicit.

Je.
Nejsem blbý, jen se hloupě ptám
2.11.2010 09:11 jeleniste | skóre: 13 | blog: Prokustovo lože
Rozbalit Rozbalit vše Re: Postgre a mazání duplicit pomocí common table expressions
Odpovědět | | Sbalit | Link | Blokovat | Admin
našel jsem řešení tady http://www.postgres.cz/index.php/PostgreSQL_SQL_Tricks#Removing_of_duplicate_rows

nicméně by mě stejně zajímalo, jak je to s tim CTE.
Nejsem blbý, jen se hloupě ptám
okbob avatar 2.11.2010 21:38 okbob | skóre: 30 | blog: systemakuv_blog | Benešov
Rozbalit Rozbalit vše Re: Postgre a mazání duplicit pomocí common table expressions
DML operace z CTE budou podporovany v 9.1.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.