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 07/02/2011, 14h50   #1
Invité de passage
 
Inscription : avril 2008
Messages : 65
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 65
Points : 3
Points : 3
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
xavier81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 14h57   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 990
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 990
Points : 18 241
Points : 18 241
Envoyer un message via MSN à CinePhil
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 :
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
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 10h02   #3
Invité de passage
 
Inscription : avril 2008
Messages : 65
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 65
Points : 3
Points : 3
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 :
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]
xavier81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 10h15   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 990
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 990
Points : 18 241
Points : 18 241
Envoyer un message via MSN à CinePhil
As-tu essayé la partie SELECT toute seule, et chaque sous-requête SELECT ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 10h58   #5
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 667
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 667
Points : 8 715
Points : 8 715
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 :
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

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 14h30   #6
Invité de passage
 
Inscription : avril 2008
Messages : 65
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 65
Points : 3
Points : 3
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.
xavier81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 16h32   #7
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
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 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
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 :
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
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 13h31   #8
Invité de passage
 
Inscription : avril 2008
Messages : 65
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 65
Points : 3
Points : 3
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
xavier81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h01.


 
 
 
 
Partenaires

Hébergement Web