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 externe entre deux select


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 72
    Points : 34
    Points
    34
    Par défaut jointure externe entre deux select
    bonjour;

    j'aimerais alimenter ma target à partir du résultat d'une jointure externe entre deux select. j'ai essayé de le faire mais j'ai toujours erreur avant même l'éxecution.
    j'utilise sql derver donc c'est du transact sql

    merci d'avance

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Conformément aux règles de ce forum, il faudrait que vous donniez la description de vois tables, la requête que vous avez essayée, un petit jeu de données et le résultat attendu pour qu'on puisse vous aider efficacement.

    Là je ne peux que vous donner une généralité faisable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT les_colonnes
    FROM
    (
      SELECT des_colonnes
      FROM une_table
      WHERE une_condition
    ) t1
    LEFT OUTER JOIN 
    (
      SELECT d_autres_colonnes
      FROM une_autre_table
      WHERE une_autre_condition
    ) t2 ON t1.une_colonne = t2.une_autre_colonne

  3. #3
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 72
    Points : 34
    Points
    34
    Par défaut
    Bonjour;

    voila le code que j'ai fait mais il y a un problème les donnée dans les champs ( A - B ) sont pas correct il me renvoie pas la difference entre les champs récupérés.






    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    INSERT INTO T_Target
     
    (
    Id
    ,[Type]
    ,[DebitV]
    ,[DebitRV]
    ,[CreditNV]
    ,[CreditRV]
    ,[Date])
     
     
        SELECT 
                      A.[id]
                         ,('Mm')
                         ,A.[DebitV] - B.[DebitV]
                         ,A.[DebitRV] - B.[DebitRV]
                         ,A.[CreditNV] - B.[CreditNV]
                         ,A.[CreditRV] - B.[CreditRV]
                         ,GETDATE () 
                        FROM 
                        ( 
                         SELECT 
                      Id
                         ,[Type]
                         ,[DebitV]
                         ,[DebitRV]
                         ,[CreditNV]
                         ,[CreditRV]
                         ,[Date])
     
                    from     
                    T_Rource 
                        WHERE Id = @CM AND
                         [Type] = 'K'                 
                        ) A
     
     
                        LEFT OUTER JOIN 
     
                        (
     
                        SELECT 
                      Id
                         ,[Type]
                         ,[DebitV]
                         ,[DebitRV]
                         ,[CreditNV]
                         ,[CreditRV]
                         ,[Date])
     
                    from     
                    T_Rource 
                    WHERE Id = @CMi AND
                     [Type] = 'K'
     
                        ) B 
     
                        ON A.[Type] = B.[Type]

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    As-tu essayé la partie SELECT toute seule, et chaque sous-requête SELECT ?

  5. #5
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    C'est parce que vous avez mis des parenthèses entre le SELECT et le FROM pour encadrer la liste de colonnes : ce n'est pas nécessaire, et cela ne respecte pas la syntaxe T-SQL.

    Vous pouvez donc écrire :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    INSERT INTO dbo.T_Target
    (
    	Id
    	, Type
    	, DebitV
    	, DebitRV
    	, CreditNV
    	, CreditRV
    	, Date
    )
    SELECT		A.id
    		, 'Mm'
    		, A.DebitV - B.DebitV
    		, A.DebitRV - B.DebitRV
    		, A.CreditNV - B.CreditNV
    		, A.CreditRV - B.CreditRV
    		, GETDATE () 
    FROM		( 
    			SELECT	Id
    				, Type
    				, DebitV
    				, DebitRV
    				, CreditNV
    				, CreditRV
    				, Date
    			FROM     dbo.T_Rource 
    			WHERE	Id = @CM 
    			AND	Type = 'K' 
    		) AS A
    LEFT JOIN	(
    			SELECT	Id
    				, Type
    				, DebitV
    				, DebitRV
    				, CreditNV
    				, CreditRV
    				, Date 
    			FROM	dbo.T_Rource 
    			WHERE	Id = @CMi 
    			AND	Type = 'K'
    		) AS B 
    		ON A.Type = B.Type
    Mais comme vous l'a conseillé CinePhil, testez le SELECT seul avant d'exécuter l'INSERT, pour être sûr de ce que vous allez insérer dans la table dbo.T_Target.

    En outre, n'oubliez pas de qualifier le nom des tables et autres objets de base de données (vues, procédures, fonctions, ...) par le nom du schéma auquel ils appartiennent : cela évite à SQL Server de le chercher à votre place.
    C'est du pouillème, mais les pouillèmes additionnés, s'il n'y étaient pas parfois, ça éviterait des petits problèmes de performances

    Ne mettez pas non plus de crochets ou de parenthèses quand ce n'est pas nécessaire.
    Les crochets décorant les colonnes ne sont nécessaires que si les colonnes n'ont pas été nommées en respectant le standard SQL, ce qui n'est apparemment pas votre cas

    Enfin indentez votre code, tout le monde y verra plus clair : vous, vos collègues, et nous

    @++

  6. #6
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 72
    Points : 34
    Points
    34
    Par défaut
    Bonjour;

    je vois pas la parentèse qui n'est pas nécessaire dans mon code j'ai enlevé celle entre select et from comme vous l'avez dit mais il m'affiche erreur avant même d'éxecuter.

  7. #7
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Petite question: vous dites qu'il ne fait pas la soustraction des valeurs: pouvez vous être plus précis?

    Les données sont elles erronées ou retournent'elles NULL?

    Pourquoi faites vous un LEFT JOIN? si B ne retourne rien votre requete retournera NULL pour tous les champ ou vous faites la soustraction.


    Essayez celà?
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
     
    INSERT INTO dbo.T_Target
    (
    	Id
    	, Type
    	, DebitV
    	, DebitRV
    	, CreditNV
    	, CreditRV
    	, Date
    )
    SELECT		A.id
    		, 'Mm'
    		, A.DebitV - ISNULL(B.DebitV,0)
    		, A.DebitRV - ISNULL(B.DebitRV,0)
    		, A.CreditNV - ISNULL(B.CreditNV,0)
    		, A.CreditRV - ISNULL(B.CreditRV,0)
    		, GETDATE () 
    FROM		( 
    			SELECT	Id
    				, Type
    				, DebitV
    				, DebitRV
    				, CreditNV
    				, CreditRV
    				, Date
    			FROM     dbo.T_Rource 
    			WHERE	Id = @CM 
    			AND	Type = 'K' 
    		) AS A
    LEFT JOIN	(
    			SELECT	Id
    				, Type
    				, DebitV
    				, DebitRV
    				, CreditNV
    				, CreditRV
    				, Date 
    			FROM	dbo.T_Rource 
    			WHERE	Id = @CMi 
    			AND	Type = 'K'
    		) AS B 
    		ON A.Type = B.Type

  8. #8
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 72
    Points : 34
    Points
    34
    Par défaut
    bonjour;

    la requête me retourne null pour les champs ou je fais la soustarction. j'ai vérifié et c'est la première sous requête qui retourne rien donc je vais essayer de corriger ça et je posterais la solution apres.

    merci

Discussions similaires

  1. Réponses: 8
    Dernier message: 20/05/2012, 15h19
  2. jointure entre deux select
    Par zoheir13 dans le forum SQL
    Réponses: 7
    Dernier message: 28/03/2009, 13h34
  3. [MySQL] Interaction entre deux select name
    Par magictom42 dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 08/07/2008, 14h43
  4. Données externes entre deux classeurs
    Par hkpsyco dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 08/10/2007, 13h17
  5. jointures externes entre plusieurs tables
    Par hacksi dans le forum Access
    Réponses: 22
    Dernier message: 15/05/2006, 16h26

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