IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Pb Suppression Doubon


Sujet :

Développement SQL Server

  1. #1
    Candidat au Club
    Inscrit en
    Avril 2002
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Pb Suppression Doubon
    Je dois ecrire une requete qui supprime dans une table Enfant les enfants ayant le meme parent avec une difference de date de naissance inferieur ou egale a 8 mois (double declaration ou venant d'origine differente, impossible de meme un controle avant l'insertion). Je dois en fait garder l'enfant avec la date de naissance la plus recente.
    La table contient un Champ IdEnfant qui est la clé primaire, le champ IdParent et le champ Date de naissance.
    J'essaye de faire une requete sans utiliser les curseurs mais je seche...
    LA 1ere piste est je pense de faire un group by Idparent et un having count(IdParent) > 1 afin d'identifier tous les parents avec au moins 2 enfants
    mais apres pour identifier si la difference entre 2 dates est inferieur a 8 mois et supprimer la ligne avec la date de naissance la plus ancienne....

    Merci pour votre aide ou toute piste d'idée.

    Eric

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Février 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 126
    Points : 143
    Points
    143
    Par défaut
    Je pense avoir une solution :

    Soit les tables enfants et parents suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE dbo.parents
    	(idParent INTEGER NOT NULL,
    	labelParent VARCHAR(100) NOT NULL)
    GO
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE TABLE dbo.enfants
    	(idEnfant INTEGER NOT NULL,
    	idParent INTEGER NOT NULL,
    	date_de_naissance SMALLDATETIME NOT NULL)
    GO
    On a les contraintes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ALTER TABLE dbo.parents
    	ADD CONSTRAINT pk_dbo_parents PRIMARY KEY (idparent)
     
    ALTER TABLE dbo.enfants
    	ADD CONSTRAINT pk_dbo_enfants PRIMARY KEY (idenfant)
     
    ALTER TABLE dbo.enfants
    	ADD CONSTRAINT fk_dbo_parents_dbo_enfants FOREIGN KEY (idparent) REFERENCES parents(idparent)
    Peuplons ces tables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    INSERT INTO dbo.parents
    (idparent, labelparent)
    SELECT 1, 'Parents Dupond'
    UNION SELECT 2, 'Parents Germain'
    UNION SELECT 3, 'Parents Jaquet'
     
    INSERT INTO dbo.enfants
    (idenfant,  idparent,date_de_naissance)
    SELECT 1,1,'20080101'
    UNION SELECT 2,1,'20080203'
    UNION SELECT 3,2,'20061116'
    UNION SELECT 4,2,'20080927'
    UNION SELECT 5,2,'20081231'
    UNION SELECT 6,3,'20090722'
    UNION SELECT 7,3,'20090723'
    UNION SELECT 8,3,'20090724'
    Pour supprimer toutes les lignes de la tables enfants ayant le même parents et dont la difference d'age est inferieure à 8 mois, on aura :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DELETE FROM enfants
    FROM (SELECT enf2.idenfant
    	 FROM dbo.enfants enf1
    		INNER JOIN dbo.enfants  enf2 ON enf1.idparent = enf2.idparent
    							AND enf1.date_de_naissance > enf2.date_de_naissance
    							AND DATEDIFF("mm",enf2.date_de_naissance, enf1.date_de_naissance)<8) filter 
    WHERE enfants.idenfant = filter.idenfant
    En vérifiant on retrouve bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT par.idparent,par.labelparent, enf.idenfant,  enf.date_de_naissance
    FROM dbo.enfants enf
    	INNER JOIN dbo.parents par ON enf.idparent = par.idparent
    1 Parents Dupond 2 2008-02-03 00:00:00
    2 Parents Germain 3 2006-11-16 00:00:00
    2 Parents Germain 5 2008-12-31 00:00:00
    3 Parents Jaquet 8 2009-07-24 00:00:00
    Par contre ce modèle est sans pitié pour les prématurés !

  3. #3
    Candidat au Club
    Inscrit en
    Avril 2002
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Bonjour Erwan1978,

    C'est parfait, cela fonctionne tres bien.
    La jointure sur la table elle même est la clé du problème
    j'oublie toujours qu'on peut le faire facilement, ca n'est tout
    simplement pas naturel pour moi.

    Merci encore pour ta réponse.

    Eric

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Annuler une suppression
    Par Harbaingan dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 09/04/2003, 14h59
  2. [DOM] suppression d'un noeud fils xml en JAVA
    Par alexandre54 dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 20/03/2003, 09h44
  3. Suppression de la contrainte unique
    Par mika dans le forum SQL
    Réponses: 3
    Dernier message: 20/02/2003, 17h56
  4. [CR] suppression du bas de page
    Par grosjej dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 10/09/2002, 08h58
  5. Réponses: 3
    Dernier message: 12/06/2002, 21h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo