cs_petifa
Messages postés215Date d'inscriptiondimanche 20 février 2005StatutMembreDernière intervention10 mars 2014
-
13 oct. 2008 à 17:20
dymsbess
Messages postés56Date d'inscriptionmercredi 29 septembre 2004StatutMembreDernière intervention 4 janvier 2010
-
3 juin 2009 à 18:34
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
cs_exar
Messages postés286Date d'inscriptionvendredi 5 décembre 2003StatutMembreDernière intervention22 avril 20121 30 mars 2009 à 11:16
Hello !
Attention qu'un distinct est coûteux en temps: il faut effectuer un sort unique... S'il y a un order by dans la query, on trie une seconde fois.
De plus, s'il y a des doublons, c'est qu'il y a un problème au niveau du datamodel...
dmuller
Messages postés6Date d'inscriptionvendredi 19 août 2005StatutMembreDernière intervention10 juin 2011 30 mars 2009 à 09:47
En quoi est-ce plus compliqué ?
Si vous voulez gérer le distinct sur "", remplacer le par n'importe quelle valeur bidon :
SELECT DISTINCT DECODE(colonne_a_traiter, '', '@@@@', colonne_a_traiter)
FROM table_a_traiter;
Si vous voulez gérer le distinct sur la valeur NULL, remplacer la par n'importe quelle valeur bidon :
SELECT DISTINCT NVL(colonne_a_traiter, '@@@@')
FROM table_a_traiter;
En espérant vous avoir été utile.
hicham1965
Messages postés1Date d'inscriptionjeudi 26 juillet 2007StatutMembreDernière intervention29 mars 2009 28 mars 2009 à 14:48
oui julien39,
c facile avec "distinct" pour "select distinct champ from table"
mais pour : ""
SELECT Distinct Formation.N_CIN, Personnel.DOTI, Personnel.nom_prenom, Personnel.Service, Formation.Lieu_Formation FROM Formation INNER JOIN Personnel ON Formation.N_CIN=Personnel.cin;
"
ca devient compliqué
cs_exar
Messages postés286Date d'inscriptionvendredi 5 décembre 2003StatutMembreDernière intervention22 avril 20121 9 mars 2009 à 14:15
Je ne sais pas si ça fonctionne avec d'autres SGBD's, mais avec Oracle, il suffit de faire:
DELETE FROM
MaTable A
WHERE
A.rowid >
ANY (SELECT B.rowid
FROM
MaTable B
WHERE
(A.col1 = B.col1 OR (A.col1 is null AND B.col1 is null))
AND
(A.col2 = B.col2 OR (A.col2 is null AND B.col2 is null))
)
;
Ou encore:
delete from
MaTable
where rowid in
(select rowid from
(select
rowid,
row_number()
over
(partition by col1 order by col1) dup
from MaTable)
where dup > 1);
cs_Julien39
Messages postés6414Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention29 juillet 2020371 20 nov. 2008 à 17:48
Oui, étonnant d'aller chercher aussi loin alors qu'un simple DISTINCT suffit !!!
dmuller
Messages postés6Date d'inscriptionvendredi 19 août 2005StatutMembreDernière intervention10 juin 2011 20 oct. 2008 à 11:56
Solution bien compliquée pour faire cela :
CREATE TABLE table_sans_doublon
AS SELECT DISTINCT colonne_doublons
FROM table_avec_doublons;
cs_petifa
Messages postés215Date d'inscriptiondimanche 20 février 2005StatutMembreDernière intervention10 mars 2014 13 oct. 2008 à 17:20
3 juin 2009 à 18:34
http://www.xoowiki.com
30 mars 2009 à 11:16
Attention qu'un distinct est coûteux en temps: il faut effectuer un sort unique... S'il y a un order by dans la query, on trie une seconde fois.
De plus, s'il y a des doublons, c'est qu'il y a un problème au niveau du datamodel...
30 mars 2009 à 09:47
Si vous voulez gérer le distinct sur "", remplacer le par n'importe quelle valeur bidon :
SELECT DISTINCT DECODE(colonne_a_traiter, '', '@@@@', colonne_a_traiter)
FROM table_a_traiter;
Si vous voulez gérer le distinct sur la valeur NULL, remplacer la par n'importe quelle valeur bidon :
SELECT DISTINCT NVL(colonne_a_traiter, '@@@@')
FROM table_a_traiter;
En espérant vous avoir été utile.
28 mars 2009 à 14:48
c facile avec "distinct" pour "select distinct champ from table"
mais pour : ""
SELECT Distinct Formation.N_CIN, Personnel.DOTI, Personnel.nom_prenom, Personnel.Service, Formation.Lieu_Formation FROM Formation INNER JOIN Personnel ON Formation.N_CIN=Personnel.cin;
"
ca devient compliqué
9 mars 2009 à 14:15
DELETE FROM
MaTable A
WHERE
A.rowid >
ANY (SELECT B.rowid
FROM
MaTable B
WHERE
(A.col1 = B.col1 OR (A.col1 is null AND B.col1 is null))
AND
(A.col2 = B.col2 OR (A.col2 is null AND B.col2 is null))
)
;
Ou encore:
delete from
MaTable
where rowid in
(select rowid from
(select
rowid,
row_number()
over
(partition by col1 order by col1) dup
from MaTable)
where dup > 1);
20 nov. 2008 à 17:48
20 oct. 2008 à 11:56
CREATE TABLE table_sans_doublon
AS SELECT DISTINCT colonne_doublons
FROM table_avec_doublons;
13 oct. 2008 à 17:20
thx