Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/08/2011, 08h54   #1
Membre régulier
 
Inscription : janvier 2006
Messages : 483
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 483
Points : 80
Points : 80
Par défaut Affichage d'une colonne sur une table pas complète

Bonjour,

Je me remets depuis quelques jours aux requêtes SQL, j'ai un petit doute et trou de mémoire.
J'ai par exemple une table article sur laquelle je veux afficher le code.

Tout simplement
Select Code
From Article

Mais je veux afficher une deuxième colonne, un prix par exemple qui appartient à une autre table "tarif". Par contre un article n'apparait pas forcément dans la table des tarifs, mais je veux tout de même qu'il s'affiche avec en première colonne son code bien sûr et en deuxième colonne que cela reste à blanc.
En sachant que j'ai également des restrictions à faire sur la table tarifs.
Exemple de la table tarifs il y a le code, prix et une année comme suit :
A - 3,41€ - 2009
A - 3,43€ - 2010
A - 3,45€ - 2011
B - 2,24€ - 2009
B - 2.27€ - 2010

Donc je fais le lien sur le code article A ou B. Mais je veux choisir d'afficher le prix 2011. Le A a bien un prix mais pas le B par contre je veux qu'il s'affiche tout de même avec la colonne prix à blanc.

Comment procéder, comment mettre en lien les deux tables ?

Merci d'avance
leloup84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 10h25   #2
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 446
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 446
Points : 7 543
Points : 7 543
Pour répondre à ton besoin, il faut utiliser une jointure externe.

Afin de combler tes trous de mémoire, tu pourras utilement relire ce tutoriel sur les jointures.
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 14h22   #3
Membre régulier
 
Inscription : janvier 2006
Messages : 483
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 483
Points : 80
Points : 80
J'ai bien lu ton tutoriel maintenant j'ai une gêne car ma sélection de base (sans parler de la jointure gauche) concerne déjà plusieurs table et plusieurs sélection voir ci-dessous :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT P.BPR_0, PD.ITMREF_0, B.BPSNUM_0, IT.TSICOD_0, PD.ITMDES_0, P.INVTYP_0, PD.QTYSTU_0, PD.STU_0, P.CUR_0, PD.AMTNOTLIN_0, I.STOFCY_0, PD.ACCDAT_0, C1.STOFCY_0, C1.CSTTYP_0, C1.YEA_0, C1.VLTTOT_0, C2.VLTTOT_0, PR.DCGVAL_1, PD.NUM_0, PD.PIDLIN_0
FROM PINVOICE P, PINVOICED PD, BPSUPPLIER B, ITMFACILIT I, ITMMASTER IT, ITMCOST C1, ITMCOST C2
WHERE P.NUM_0=PD.NUM_0
AND P.BPR_0=B.BPSNUM_0
AND PD.ITMREF_0=I.ITMREF_0
AND PD.ITMREF_0=IT.ITMREF_0
AND PD.ITMREF_0=C1.ITMREF_0
AND PD.ITMREF_0=C2.ITMREF_0
AND P.BPR_0!=PR.PLICRI1_0
AND PD.ITMREF_0!=PR.PLICRI2_0
AND (P.BPR_0 BETWEEN '{?fourdeb}' AND '{?fourfin}')
AND (PD.ACCDAT_0 BETWEEN {?datedeb} AND {?datefin})
AND (PD.ITMREF_0 BETWEEN '{?artdeb}' AND '{?artfin}')
AND P.CUR_0='EUR'
AND I.STOFCY_0='LOU'
AND C1.STOFCY_0='LOU'
AND C1.CSTTYP_0=3
AND C1.YEA_0=2012
AND C2.STOFCY_0='LOU'
AND C2.CSTTYP_0=2
AND C2.YEA_0=2012
Et ce que je veux rajouter c'est et cette partie là qui peut renvoyer ou non un résultat :
Code :
1
2
3
FROM PPRICLIST PR
AND PR.DCGVAL_1>0
AND (PD.ACCDAT_0 BETWEEN PR.PLISTRDAT_0 AND PR.PLIENDDAT_0)
Je ne vois pas comment refaire ce lien.

Merci d'avance
leloup84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 14h34   #4
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 446
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 446
Points : 7 543
Points : 7 543
Commence par reprendre ta requête en utilisant les jointures normalisées (INNER JOIN ... ON ...), ce sera déjà tout de suite plus lisible.
Il deviendra alors facile de remplacer une jointure stricte par une jointure externe à l'endroit nécessaire.
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 14h56   #5
Membre régulier
 
Inscription : janvier 2006
Messages : 483
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 483
Points : 80
Points : 80
Code :
1
2
3
4
SELECT P.BPR_0, PD.ITMREF_0
FROM PINVOICE P
INNER JOIN PINVOICED PD
ON P.NUM_0  = PD.NUM_0
Voilà ce que j'ai fait cela fonctionne. Comment je dois articuler pour l'ajout d'une troisième table sans parler encore de jointure externe.
Je n'ai jamais travaillé avec ce type de jointure. Je ne sais où placer ma 3ème table et la jointure.
leloup84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 15h15   #6
Membre régulier
 
Inscription : janvier 2006
Messages : 483
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 483
Points : 80
Points : 80
C'est bon j'ai donc retravailler ma requête comme demandé et cela me donne çà :
Code :
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
SELECT P.BPR_0, PD.ITMREF_0, B.BPSNUM_0, IT.TSICOD_0, PD.ITMDES_0, P.INVTYP_0, PD.QTYSTU_0, PD.STU_0, P.CUR_0, PD.AMTNOTLIN_0, I.STOFCY_0, PD.ACCDAT_0, C1.STOFCY_0, C1.CSTTYP_0, C1.YEA_0, C1.VLTTOT_0, C2.VLTTOT_0, PD.NUM_0, PD.PIDLIN_0
FROM PINVOICE P
INNER JOIN PINVOICED PD
ON P.NUM_0=PD.NUM_0
INNER JOIN BPSUPPLIER B
ON P.BPR_0=B.BPSNUM_0
INNER JOIN ITMFACILIT I
ON PD.ITMREF_0=I.ITMREF_0
INNER JOIN ITMMASTER IT
ON PD.ITMREF_0=IT.ITMREF_0
INNER JOIN ITMCOST C1
ON PD.ITMREF_0=C1.ITMREF_0
INNER JOIN ITMCOST C2
ON PD.ITMREF_0=C2.ITMREF_0
AND (P.BPR_0 BETWEEN '{?fourdeb}' AND '{?fourfin}')
AND (PD.ACCDAT_0 BETWEEN {?datedeb} AND {?datefin})
AND (PD.ITMREF_0 BETWEEN '{?artdeb}' AND '{?artfin}')
AND P.CUR_0='EUR'
AND I.STOFCY_0='LOU'
AND C1.STOFCY_0='LOU'
AND C1.CSTTYP_0=3
AND C1.YEA_0=2012
AND C2.STOFCY_0='LOU'
AND C2.CSTTYP_0=2
AND C2.YEA_0=2012
Maintenant comment intégrer et à quel endroit intégrer ce qu'il me reste pour que cela soit pris dans ma requête même si je n'ai pas de donnée dans la table.
Ce qu'il me reste à rajouter :
Code :
1
2
3
4
5
 
SELECT PR.DCGVAL_1
FROM PPRICLIST PR
AND PR.DCGVAL_1>0
AND (PD.ACCDAT_0 BETWEEN PR.PLISTRDAT_0 AND PR.PLIENDDAT_0)
leloup84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 15h19   #7
Membre régulier
 
Inscription : janvier 2006
Messages : 483
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 483
Points : 80
Points : 80
Sachant qu'il y a deux jointures à faire
Code :
1
2
AND P.BPR_0=PR.PLICRI1_0
AND PD.ITMREF_0=PR.PLICRI2_0
leloup84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 15h48   #8
Membre régulier
 
Inscription : janvier 2006
Messages : 483
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 483
Points : 80
Points : 80
Pour information j'ai tenté comme ci-dessous pour la double jointure mais çà ne fonctionne pas ligne concerné (15, 16, 17 et 18) :

Code :
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
SELECT P.BPR_0, PD.ITMREF_0, B.BPSNUM_0, IT.TSICOD_0, PD.ITMDES_0, P.INVTYP_0, PD.QTYSTU_0, PD.STU_0, P.CUR_0, PD.AMTNOTLIN_0, I.STOFCY_0, PD.ACCDAT_0, C1.STOFCY_0, C1.CSTTYP_0, C1.YEA_0, C1.VLTTOT_0, C2.VLTTOT_0, PD.NUM_0, PD.PIDLIN_0, PR.DCGVAL_1
FROM PINVOICE P
INNER JOIN PINVOICED PD
ON P.NUM_0=PD.NUM_0
INNER JOIN BPSUPPLIER B
ON P.BPR_0=B.BPSNUM_0
INNER JOIN ITMFACILIT I
ON PD.ITMREF_0=I.ITMREF_0
INNER JOIN ITMMASTER IT
ON PD.ITMREF_0=IT.ITMREF_0
INNER JOIN ITMCOST C1
ON PD.ITMREF_0=C1.ITMREF_0
INNER JOIN ITMCOST C2
ON PD.ITMREF_0=C2.ITMREF_0
LEFT OUTER JOIN PPRICLIST PR
ON P.BPR_0=PR.PLICRI1_0
LEFT OUTER JOIN PPRICLIST PR
ON PD.ITMREF_0=PR.PLICRI2_0
AND (P.BPR_0 BETWEEN '{?fourdeb}' AND '{?fourfin}')
AND (PD.ACCDAT_0 BETWEEN {?datedeb} AND {?datefin})
AND (PD.ITMREF_0 BETWEEN '{?artdeb}' AND '{?artfin}')
AND P.CUR_0='EUR'
AND I.STOFCY_0='LOU'
AND C1.STOFCY_0='LOU'
AND C1.CSTTYP_0=3
AND C1.YEA_0=2012
AND C2.STOFCY_0='LOU'
AND C2.CSTTYP_0=2
AND C2.YEA_0=2012
leloup84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 15h51   #9
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Remplacer votre 1er AND par un WHERE !
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 16h15   #10
Membre régulier
 
Inscription : janvier 2006
Messages : 483
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 483
Points : 80
Points : 80
C'est pas mieux il me met en erreur :
"Column ambiguously defined"
leloup84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 16h25   #11
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Vous avez 2 alias identiques !
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2011, 16h31   #12
Membre régulier
 
Inscription : janvier 2006
Messages : 483
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 483
Points : 80
Points : 80
Ce que vous appelez alias c'est PPRICLIST PR qui apparait dans deux jointures ?
Car j'ai mis çà deux fois car c'est la même table mais il y a deux jointures.

Alors que pour les tables nomées ITMCOST C1 et ITMCOST C2, là c'était deux tables différentes.

Pouvez-vous m'expliquer la différence ?
leloup84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/08/2011, 09h33   #13
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
L'alias sert précisément a donner un "surnom" (surnommage) a une table afin de rendre la requete plus lisible, et permettre aussi de differencier les sources de données dans le cas d'une autojointure par exemple

Exemple :

Code :
1
2
3
4
5
6
SELECT A.MaColonne,B.MonAutreColonne
FROM
   MaTable A 
INNER JOIN MaTable B
WHERE
    A.Col1 = B.Col2
Est une autojointure (donc meme table) mais pour les différencier, j'utilise les alias A et B afin de pouvoir écrire ma condition de jointure.

Il est évident que vous devez passer plus de temps sur le tutoriel des jointures ... Cela vous évitera de perdre du temps et approfondira vos connaissances
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h05.


 
 
 
 
Partenaires

Hébergement Web