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

MS SQL Server Discussion :

left outer join SQL/ODBC


Sujet :

MS SQL Server

  1. #1
    Candidat au Club
    Inscrit en
    Janvier 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 9
    Points : 4
    Points
    4
    Par défaut left outer join SQL/ODBC
    Bonjour tout le monde

    je veux réalisé un petit programme avec vb.net mais l'accès à la base de donnée est avec ODBC
    J'ai cet requête je l'ai exécuté dans SQL est ca marche très bien
    lorsque j'insère la requête dans le programme, des erreur s'affiche
    voila la 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    SELECT
      T1.Nom_Client
    , T1.Code_Client
    , T1.Code_Facture
    , montantTTC
    , MontantREGL 
    FROM 
     
    (select 
      CLIENT.Nom_Client
    , FACTURE.Code_Client
    , FACTURE.Code_Facture
    , montantTTC
    FROM CLIENT, FACTURE
    WHERE CLIENT.Code_Client=FACTURE.Code_Client) as T1
     
    left outer join 
     
    (select F_REGLEMENT.Code_Facture
    , MontantREGL
    FROM F_REGLEMENT )AS T2
     
    ON T1.Code_Client=T2.Code_Client

    est ce que le problème au niveau des alias ? si oui comment je peux résoudre le problème

    MERCI d'avance

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par chidalife Voir le message
    des erreur s'affiche
    Question bête...
    Lesquelles ?

  3. #3
    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,

    Plusieurs petites erreurs dans cette requête (je ne pense pas que ce soit celles-ci qui provoquent l'erreur ODBC):

    - le nom des colonnes n'est pas toujours qualifié par le nom de l'alias de table à laquelle les colonnes appartiennent;

    - les tables ne sont pas qualifiées par le nom du schéma auquel elles appartiennent, ce qui oblige le moteur de base de données à interroger les tables de méta-données pour savoir quel est le schéma par défaut de l'utilisateur qui exécute la requête;

    - une jointure est d'un autre temps : elle est spécifiée dans un WHERE alors que l'on devrait plutôt utiliser le mot-clé JOIN qui permet de séparer les prédicats de jointures des filtres de la requête. Cela peut s'avérer contre-performant dans certains cas;

    - Votre requête peut s'écrire sans tables dérivées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT		C.Nom_Client
    		, C.Code_Client
    		, F.Code_Facture
    		, F.montantTTC
    		, R.MontantREGL
    FROM		dbo.CLIENT AS C
    INNER JOIN	dbo.FACTURE AS F ON C.Code_Client = F.Code_Client
    LEFT JOIN	dbo.F_REGLEMENT AS R ON F.Code_Client = R.Code_Client
    @++

  4. #4
    Candidat au Club
    Inscrit en
    Janvier 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    BONJOUR ,
    La solution de elsuket est intéressante
    de tout façon merci pour vous deux c'est très gentil de votre par

  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
    Notez néanmoins que ce n'est probablement pas la solution de votre problème de départ

    @++

  6. #6
    Candidat au Club
    Inscrit en
    Janvier 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 9
    Points : 4
    Points
    4
    Par défaut jointure odbc /sql
    bonjour

    je suis vraiment désolé mais j'ai toujours le message d'erreur suivant

    ERROR [42000] [Simba][Simba ODBC Driver](select DO_Tiers,CT_Intitule,(SUM (DL_MontantTTC)-SUM (RC_Montant))SOLDE from (SELECT<< ??? >> DO_Tiers,CT_Intitule,T1.DO_Piece,DO_Date,DL_MontantTTC,coalesce(RC_Montant,0)RC_Montant FROM (select E.DO_Tiers,T.CT_Intitule,E.DO_Piece,E.DO_Date,SUM(DL.DL_MontantTTC)DL_MontantTTCfrom F_DOCLIGNE DL,F_DOCENTETE E ,F_COMPTET T where (E.DO_Piece=DL.DO_Piece) and (E.DO_Tiers=T.CT_Num) and DL.DO_Domaine=0 and CT_Type=0 and (DL.DO_Type=6 or DL.DO_Type=7 ) GROUP BY E.DO_Tiers,T.CT_In
    ERROR [42000] [Simba][Simba ODBC Driver]Syntax Error.
    ce que j'arrive pas à comprendre c'est que la requête s'exécute correctement au niveau de l'analyseur de requête SQL mais une fois je l'insère dans mon programme l'erreur s'affiche
    Est ce qu'il me manque quelque chose au niveau de la requête ou bien des pilote ODBC / SQL ?

    Merci d'avance

  7. #7
    Candidat au Club
    Inscrit en
    Janvier 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    ah j'ai oublié voila 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  DO_Tiers,CT_Intitule,(SUM (DL_MontantTTC)-SUM (RC_Montant))SOLDE from 
    (SELECT DO_Tiers,CT_Intitule,T1.DO_Piece,DO_Date,DL_MontantTTC,coalesce(RC_Montant,0)RC_Montant FROM 
    (select E.DO_Tiers,T.CT_Intitule,E.DO_Piece,E.DO_Date,SUM(DL.DL_MontantTTC)DL_MontantTTC
    from F_DOCLIGNE   DL,F_DOCENTETE   E ,F_COMPTET   T
    where (E.DO_Piece=DL.DO_Piece) and (E.DO_Tiers=T.CT_Num)
    and DL.DO_Domaine=0 and CT_Type=0 and (DL.DO_Type=6 or DL.DO_Type=7 ) 
     
    GROUP BY E.DO_Tiers,T.CT_Intitule,E.DO_Piece,E.DO_Date)  T1
    LEFT OUTER JOIN 
    (select DO_Piece,SUM(RC_Montant)RC_Montant from F_REGLECH RH
    where  RH.DO_Domaine=0 and (RH.DO_Type=6 or RH.DO_Type=7 )
    group by DO_Piece)  T2
    ON T1.DO_Piece=T2.DO_Piece ) T002
    GROUP BY DO_Tiers,CT_Intitule )

  8. #8
    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
    Je ne sais pas comment vous faites pour lire une requête qui n'est pas indentée.
    Vous pouvez également la simplifier (dès SQL 2005):

    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
    ;WITH
    	T2 AS
    	(
    		SELECT	DO_Piece
    			, ISNULL(SUM(RC_Montant), 0) AS RC_Montant
    		FROM	F_REGLECH
    		WHERE	DO_Domaine = 0
    		AND	DO_Type BETWEEN 6 AND 7
    		GROUP	BY DO_Piece	
    	),
    	CTE AS
    	(
    		SELECT		E.DO_Tiers
    				, T.CT_Intitule
    				, E.DO_Piece
    				, E.DO_Date
    				, SUM(DL.DL_MontantTTC) AS DL_MontantTTC
    				, T2.RC_Montant
    		FROM		F_DOCLIGNE AS DL
    		INNER JOIN	F_DOCENTETE AS  E
    					ON E.DO_Piece = DL.DO_Piece
    		INNER JOIN	F_COMPTET AS T
    					ON E.DO_Tiers = T.CT_Num
    		LEFT JOIN	T2
    					ON E.DO_Piece = T2.DO_Piece
    		WHERE		DL.DO_Domaine = 0
    		AND		CT_Type = 0
    		AND		DL.DO_Type BETWEEN 6 AND 7
    		GROUP BY	E.DO_Tiers
    				, T.CT_Intitule
    				, E.DO_Piece
    				, E.DO_Date
    	)
    SELECT	DO_Tiers
    	, CT_Intitule
    	, SUM(DL_MontantTTC) - SUM(RC_Montant) AS SOLDE
    FROM	CTE
    Et sous SQL Server 2000 :

    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
    SELECT	DO_Tiers
    	, CT_Intitule
    	, SUM(DL_MontantTTC) - SUM(RC_Montant) AS SOLDE
    FROM
    (
    	SELECT		E.DO_Tiers
    			, T.CT_Intitule
    			, E.DO_Piece
    			, E.DO_Date
    			, SUM(DL.DL_MontantTTC) AS DL_MontantTTC
    			, S.RC_Montant
    	FROM		F_DOCLIGNE AS DL
    	INNER JOIN	F_DOCENTETE AS  E
    				ON E.DO_Piece = DL.DO_Piece
    	INNER JOIN	F_COMPTET AS T
    				ON E.DO_Tiers = T.CT_Num
    	LEFT JOIN	(
    				SELECT	DO_Piece
    					, ISNULL(SUM(RC_Montant), 0) AS RC_Montant
    				FROM	F_REGLECH
    				WHERE	DO_Domaine = 0
    				AND	DO_Type BETWEEN 6 AND 7
    				GROUP	BY DO_Piece
    			) AS S ON E.DO_Piece = S.DO_Piece
    	WHERE		DL.DO_Domaine = 0
    	AND		CT_Type = 0
    	AND		DL.DO_Type BETWEEN 6 AND 7
    	GROUP BY	E.DO_Tiers
    			, T.CT_Intitule
    			, E.DO_Piece
    			, E.DO_Date
    ) AS T
    Vous noterez que j'ai changé votre DL.DO_Type = 6 OR DL.DO_Type = 7 en DL.DO_Type BETWEEN 6 AND 7, ceci afin de rentre le filtre SARGable

    Si elle s'exécute bien dans l'analyseur de requête mais pas depuis votre application, utiliser le Profiler pour voir le texte de la requête que vous passez au moteur (événement SQL:Batch Starting et sa colonne TextData)

    @++

Discussions similaires

  1. SQL server 2005 : left outer join
    Par backdraf dans le forum Développement
    Réponses: 3
    Dernier message: 31/05/2011, 19h04
  2. Requête SQL LEFT OUTER JOIN
    Par dam28800 dans le forum Langage SQL
    Réponses: 42
    Dernier message: 27/02/2009, 15h41
  3. Problème avec left outer join
    Par jgfa9 dans le forum Requêtes
    Réponses: 1
    Dernier message: 22/08/2005, 22h07
  4. Problème de performance avec LEFT OUTER JOIN
    Par jgfa9 dans le forum Requêtes
    Réponses: 6
    Dernier message: 17/07/2005, 14h17
  5. concatenation de chaine dans un left outer join
    Par the_edge dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 11/11/2004, 17h08

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