Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes 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 16/06/2011, 12h31   #1
Membre régulier
 
Inscription : octobre 2004
Messages : 328
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 328
Points : 92
Points : 92
Envoyer un message via MSN à Ticoche
Par défaut [SQL server 2K5] Ajouter résultats avec join ?

Bonjour,

J'ai une table de résultat. J'aimerai ajouter des résultats à cette table sans en modifier le nombre de ligne, en faisant une jointure sur une autre table.

Est-ce possible ?

exemple :

Table A
ID (identifiant)
valA (une valeur)

Table B
ID (identifiant pouvant être lié à Table A)
valB (une autre valeur)

La table A retourne 3 lignes sur un select simple.
La table B retourne 10 lignes sur un select simple (Table B possède plus de ID que Table A)

Dans ma sélection j'aimerai donc avoir 3 résultats avec les champs : ID, valA, valB

j'ai essayé une jointure inner join, en ajoutant une condition where ID in (la selection de TableA) mais j'obtiens toujours le nombre de ligne de TableB.

Merci
Ticoche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 13h28   #2
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 954
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 954
Points : 17 774
Points : 17 774
jointure externe full + prédicat dans la clause ON du JOIN

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 14h13   #3
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour


Si une jointure interne vous donne 10 lignes, c'est que chaque ligne de la table B correspond à une ligne de la table A, et donc que certains ID de la table A sont présent plusieurs fois dans la table B. La question est donc, quelle valeur ValB voulez vous prendre pour un ligne de la table A qui aurait plusieurs correspondances dans la table B ?

Exemple :
Table A :
1, 2

Table B
1, 10
1, 20

Que voulez vous comme résultat : 1,2,10 ou 1,2,20 ?
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 14h18   #4
Membre régulier
 
Inscription : octobre 2004
Messages : 328
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 328
Points : 92
Points : 92
Envoyer un message via MSN à Ticoche
Avec un petit exemple, ça donnerai quoi ?

Code :
1
2
3
4
5
 
SELECT t1.ID,t1.valA,t2.valB
FROM tableA t1
full OUTER JOIN tableB t2 
ON t1.ID = t2.ID AND ???
??? = je met quoi ?
t1.id in
(
select id from tableA
)

Petite précision, dans mon exemple très simplifié, je n'ai pas mis le select réél de ma table, qui contient des conditions, des jointures sur plusieurs tables, et un group by. En fait ma requête de ma tableA ressemble plus à ça :

select a,b,c,d,e

from table1 t1
inner join table2 t2 on t1.a = t2.a
left join table3 t3 on t3.b = t2.b

where
t2.c = 'truc' or
t2.c = 'machin' or
t2.c = 'bidule'

group by
t1.a
,t2.b
,t3.c

Merci

édit :

Citation:
Envoyé par aieeeuuuuu Voir le message
Bonjour


Si une jointure interne vous donne 10 lignes, c'est que chaque ligne de la table B correspond à une ligne de la table A, et donc que certains ID de la table A sont présent plusieurs fois dans la table B. La question est donc, quelle valeur ValB voulez vous prendre pour un ligne de la table A qui aurait plusieurs correspondances dans la table B ?

Exemple :
Table A :
1, 2

Table B
1, 10
1, 20

Que voulez vous comme résultat : 1,2,10 ou 1,2,20 ?
Ha oui, c'est tout à fait vrai !
C'est une bonne piste pour corriger ma requête.
Mettons que je veulent prendre 1,2,20, je suppose que je dois ajouter une condition quelque part ?
Ticoche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 14h48   #5
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
vous devez surtout commencer par la définir cette condition !!!
Qu'est ce qui vous fait choisir 20 plutôt que 10 ?

si par exemple vous voulez prendre le max, alors ça pourrait être :

Code SQL :
1
2
3
4
5
6
 
SELECT A.id, valA, MAX(ValB)
FROM A
INNER JOIN B
    ON A.id = B.id
GROUP BY A.id, ValA

ou une alternative qui peut être plus efficace :

Code SQL :
1
2
3
4
5
6
7
8
9
 
SELECT A.id, valA, valB
FROM A
CROSS APPLY (
    SELECT TOP(1) valB
    FROM B
    WHERE B.id = A.id
    ORDER BY valB DESC
) T
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 14h54   #6
Membre régulier
 
Inscription : octobre 2004
Messages : 328
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 328
Points : 92
Points : 92
Envoyer un message via MSN à Ticoche
Merci beaucoup.

Problème résolu ^^
Ticoche 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 19h07.


 
 
 
 
Partenaires

Hébergement Web