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 :

Jointure sur une même table


Sujet :

Développement SQL Server

  1. #1
    Membre actif Avatar de JmL40
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 348
    Points : 246
    Points
    246
    Par défaut Jointure sur une même table
    Bonjour,

    Je souhaite réaliser une jointure sur une même table (auto-jointure) pour comparer les lignes une à une en fonction de trois conditions (comprises dans les conditions de jointure).

    Voici ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT 
    	T1.CODE_EXP AS CODE1,	
    	T2.CODE_EXP AS CODE2,
    	T2.LOT,	
    	T2.MARQUEUR,
    	T2.VALEUR,
    	T1.LOT,		
    	T1.MARQUEUR,
    	T1.VALEUR
    FROM TEST AS T2 INNER JOIN TEST AS T1 
    	ON T2.MARQUEUR = T1.MARQUEUR 
    		AND T2.SETS = T1.SETS
    			AND T2.CODE_EXP <> T1.CODE_EXP
    Ma demande est simple, cette me requête me retourne, une ligne d'enregistrement avec CODE1 = A et CODE2 = B mais aussi l'inverse CODE1 = B et CODE2 = B.

    Or je ne voudrais retourner qu'une seule association de A et B, dans un seul sens et non l'inverse c'est-à-dire l'association B et A, pour des questions de traitements, de temps ...

    Si vous avez une solution, je suis preneur ou si tout simplement cela est impossible ! Merci de m'éclairer ...

    Cordialement

  2. #2
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Bonjour,

    Merci de nous donner la DDL de votre table ainsi qu'un jeu de donnees.

    ++

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 902
    Points : 51 646
    Points
    51 646
    Billets dans le blog
    6
    Par défaut
    Il faut utiliser le ROW VALUE CONSTRUCTOR avec une inégalité pour ne pas prendre en compte les faux doublons....

    A lire : http://sqlpro.developpez.com/cours/sqlaz/select/#L8

    DONC :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ON  T2.MARQUEUR > T1.MARQUEUR
    OR (T2.MARQUEUR = T1.MARQUEUR AND T2.SETS > T1.SETS)
    OR (T2.MARQUEUR = T1.MARQUEUR AND T2.SETS = T1.SETS AND T2.CODE_EXP > T1.CODE_EXP)

    A +

  4. #4
    Membre actif Avatar de JmL40
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 348
    Points : 246
    Points
    246
    Par défaut
    Structure de ma table :

    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
     
    CREATE TABLE [dbo].[TEST](
    	[ID] [int] IDENTITY(1,1) NOT NULL,
    	[CODE_FICHE] [int] NULL,
    	[MARQUEUR] [char](15) COLLATE French_CI_AS NULL,
    	[LOT] [char](50) COLLATE French_CI_AS NULL,
    	[VALEUR] [char](20) COLLATE French_CI_AS NULL,
    	[CODE_EXP] [char](30) COLLATE French_CI_AS NULL,
    	[TYPE] [char](1) COLLATE French_CI_AS NULL,
    	[SETS] [char](10) COLLATE French_CI_AS NULL,
     CONSTRAINT [PK_LAB] PRIMARY KEY CLUSTERED 
    (
    	[ID] ASC
    )
    WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY]
    Jeux de données possible :

    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
     
    610629	972	1108 0--0*  147*  38A2042* L	GENO*****
    610630	972	1175 0--0*  152*  38A2042* L	GENO*****
    610632	972	1208 0--0*  121*  38A2042* L	GENO*****
    610658	1282	1108 0--0*  147*  80A8107* L	GENO*****
    610659	1632	1131 0--0*  126*  LEJ42*** L	GENO*****
    610660	1632	1138 0--0*  205*  LEJ42*** L	GENO*****
    610662	1632	1175 0--0*  161*  LEJ42*** L	GENO*****
    610664	1632	1237 0--0*  169*  LEJ42*** L	GENO*****
    610665	1632	1257 0--0*  204*  LEJ42*** L	GENO*****
    610666	1632	1270 0--0*  175*  LEJ42*** L	GENO*****
    610668	1282	1131 0--0*  118*  80A8107* L	GENO*****
    610669	1282	1138 0--0*  195*  80A8107* L	GENO*****
    610671	1282	1208 0--0*  136*  80A8107* L	GENO*****
    610672	1282	1237 0--0*  169*  80A8107* L	GENO*****

  5. #5
    Membre actif Avatar de JmL40
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 348
    Points : 246
    Points
    246
    Par défaut
    Merci SQLPro, je met en place cette solution de suite ...

    Cordialement

  6. #6
    Membre actif Avatar de JmL40
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 348
    Points : 246
    Points
    246
    Par défaut
    Le problème étant que cette fonction n'est pas disponible sous SQL Server 2005 ?

    Comment puis-je contourner ??????

    [EDIT]

    Je pense avoir réussi en rajoutant une condition de ma jointure à savoir : T1.ID > T2.ID. J'utilise l'ID, soit la clé primaire de ma table, en ne prenant que les ID supérieur pour le parcours T1 par rapport à T2.

    Ma requête devient alors :

    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
    17
     
    SELECT 
    	T1.CODE_FICHE,	
    	T2.CODE_FICHE,
    	T1.CODE_EXP AS CODE1,	
    	T2.CODE_EXP AS CODE2,
    	T2.LOT,	
    	T2.MARQUEUR,
    	T2.VALEUR,
    	T1.LOT,		
    	T1.MARQUEUR,
    	T1.VALEUR
    FROM TEST AS T2 INNER JOIN TEST AS T1 
    	ON T2.MARQUEUR = T1.MARQUEUR 
    		AND T2.SETS = T1.SETS
    			AND T2.CODE_EXP <> T1.CODE_EXP
    				AND T1.ID > T2.ID
    Cordialement

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 902
    Points : 51 646
    Points
    51 646
    Billets dans le blog
    6
    Par défaut
    Relis le "DONC" de mon post précédent !

    A +

Discussions similaires

  1. Jointure sur une même table
    Par franquis dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/04/2010, 11h49
  2. Auto-jointure sur une même table
    Par West01 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 23/10/2008, 15h46
  3. [1.x] Jointure sur une même table
    Par tyx dans le forum Symfony
    Réponses: 1
    Dernier message: 04/08/2008, 11h19
  4. Auto jointure (sur une même table)
    Par freestyler dans le forum Langage SQL
    Réponses: 16
    Dernier message: 20/05/2008, 15h16
  5. jointure sur une même table
    Par guillaumeVb6 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 06/09/2004, 15h08

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