Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
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 06/02/2008, 16h14   #1
Rédacteur
 
Avatar de Stessy
 
Homme Stessy Delcroix
Senior Software Engineer JEE
Inscription : avril 2002
Messages : 744
Détails du profil
Informations personnelles :
Nom : Homme Stessy Delcroix
Âge : 37
Localisation : Belgique

Informations professionnelles :
Activité : Senior Software Engineer JEE
Secteur : Finance

Informations forums :
Inscription : avril 2002
Messages : 744
Points : 1 092
Points : 1 092
Par défaut insert into table(.,.,.) select . from t2, select . from t3

Bonjour à tous,

voilà mon problème est simple.
Est-il possible d'insérer des données dans une table provenant d'autres table

exemple

Code :
 INSERT INTO table1 (col1,col2,col3) SELECT t2 FROM table2 WHERE t3 = 10, SELECT t4 FROM table3 WHERE t5 = 20, SELECT t6 FROM table4 WHERE t7 = 40;
D'avance merci pour vos réponses
__________________
Langages : Java, SQL
Outils : Eclipse, Intellij
SGBD : Oracle, PostgreSQL
Mes Articles
Stessy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2008, 16h24   #2
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 319
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 319
Points : 5 837
Points : 5 837
Citation:
Envoyé par Stessy Voir le message
Bonjour à tous,

voilà mon problème est simple.
Est-il possible d'insérer des données dans une table provenant d'autres table

exemple

Code :
 INSERT INTO table1 (col1,col2,col3) SELECT t2 FROM table2 WHERE t3 = 10, SELECT t4 FROM table3 WHERE t5 = 20, SELECT t6 FROM table4 WHERE t7 = 40;
D'avance merci pour vos réponses
Avez-vous fait un test ?
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2008, 16h33   #3
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
UNION ALL pour concaténer les résultats de tes SELECT
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2008, 16h42   #4
Rédacteur
 
Avatar de Stessy
 
Homme Stessy Delcroix
Senior Software Engineer JEE
Inscription : avril 2002
Messages : 744
Détails du profil
Informations personnelles :
Nom : Homme Stessy Delcroix
Âge : 37
Localisation : Belgique

Informations professionnelles :
Activité : Senior Software Engineer JEE
Secteur : Finance

Informations forums :
Inscription : avril 2002
Messages : 744
Points : 1 092
Points : 1 092
Citation:
Envoyé par orafrance Voir le message
UNION ALL pour concaténer les résultats de tes SELECT
Bonjour Orafance,

le union all ne marchera pas car je souhaite que le premier select me donne la valeur à rentrer dans la première colonne, le deuxième select me donne la valeur à rentrer dans la deuxième colonne, ...

Code :
INSERT INTO personnes_match (match_id,personne_id,prix_locomotion_id) SELECT match_id FROM match WHERE match_id = 7 union ALL SELECT personne_id FROM personnes WHERE personne_id = 448 union ALL SELECT  1 FROM dual
Cette query ne marche pas: 'not enough values'


Merci
__________________
Langages : Java, SQL
Outils : Eclipse, Intellij
SGBD : Oracle, PostgreSQL
Mes Articles
Stessy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2008, 17h18   #5
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
Citation:
Envoyé par Stessy Voir le message
Bonjour à tous,

voilà mon problème est simple.
Est-il possible d'insérer des données dans une table provenant d'autres table

exemple

Code :
 INSERT INTO table1 (col1,col2,col3) SELECT t2 FROM table2 WHERE t3 = 10, SELECT t4 FROM table3 WHERE t5 = 20, SELECT t6 FROM table4 WHERE t7 = 40;
D'avance merci pour vos réponses
sans doute qqch du style non?


Code :
1
2
3
4
5
6
INSERT INTO table1 (col1,col2,col3) 
VALUES (
  (SELECT t2 FROM table2 WHERE t3 = 10), 
  (SELECT t4 FROM table3 WHERE t5 = 20), 
  (SELECT t6 FROM table4 WHERE t7 = 40)
);
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2008, 21h54   #6
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 319
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 319
Points : 5 837
Points : 5 837
Citation:
Envoyé par laurentschneider Voir le message
sans doute qqch du style non?


Code :
1
2
3
4
5
6
INSERT INTO table1 (col1,col2,col3) 
VALUES (
  (SELECT t2 FROM table2 WHERE t3 = 10), 
  (SELECT t4 FROM table3 WHERE t5 = 20), 
  (SELECT t6 FROM table4 WHERE t7 = 40)
);
Ou
Code :
1
2
3
4
5
6
7
 
INSERT INTO table1 (col1, col2, col3)
SELECT t2, t4, t6
  FROM table2, table3, table4
WHERE t3 = 10
  AND t5 = 20
  AND t6 = 40
mais je pense maintenant que son problème doit être un peu plus compliqué que ça
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2008, 22h16   #7
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
sauf erreur cette solution provoquera un produit cartésien donc bien plus de ligne qu'attendue non ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2008, 23h59   #8
Invité de passage
 
Inscription : février 2008
Messages : 3
Détails du profil
Informations personnelles :
Âge : 39
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2008
Messages : 3
Points : 4
Points : 4
Bonsoir,

Union semble une bonne solution mais besoin un pivot peut être ?

Si l' union des tables sources donnent :

Code :
1
2
3
4
5
6
7
 
SELECT 'S1' AS "SOURCE",name,value FROM S1 WHERE value>=10
union
SELECT 'S2' AS "SOURCE",name,value  FROM S2 WHERE value>=200
union 
SELECT 'S3' AS "SOURCE",name,value  FROM S3 WHERE value>=3000
;

S1|nb|10
S1|nb|20
S1|nb|30
S2|nb|200
S2|nb|300
S3|nb|3000


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
SELECT 
CASE WHEN SOURCE='S1' THEN VALUE ELSE NULL END AS "COL1",
CASE WHEN SOURCE='S2' THEN VALUE ELSE NULL END AS "COL2",
CASE WHEN SOURCE='S3' THEN VALUE ELSE NULL END AS "COL3"
FROM
(
SELECT 'S1' AS "SOURCE",ID,name,value FROM S1 WHERE value>=10
union
SELECT 'S2' AS "SOURCE",ID,name,value  FROM S2 WHERE value>=200
union 
SELECT 'S3' AS "SOURCE",ID,name,value  FROM S3 WHERE value>=3000
)
;

10|NULL|NULL
20|NULL|NULL
30|NULL|NULL
NULL|200|NULL
NULL|300|NULL
NULL|NULL|3000


En rajoutant un flag sur les lignes à regrouper, un group by et un sum pourrait les remettre sur la mettre ligne...

le flag doit être unique et bien évidement commun au ligne que l' on souhaite regrouper, par exemple une date si le contexte le permet ou autre chose peu importe

20080206|10|NULL|NULL
20080201|20|NULL|NULL
20071201|30|NULL|NULL
20080206|NULL|200|NULL
20080101|NULL|300|NULL
20080101|NULL|NULL|3000

group by et sum :
20071201|30|NULL|NULL
20080101|NULL|300|3000
20080201|20|NULL|NULL
20080206|10|200|NULL

Sur le résultat obtenu,
INSERT INTO <CIBLE>
SELECT ...
GROUP BY

C' est tordu mais bon ... si quelqu' un connait bien les pivots il trouvera surement plus simple que ces agrégats...

Bonne soirée
mornixuur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2008, 09h11   #9
Rédacteur
 
Avatar de Stessy
 
Homme Stessy Delcroix
Senior Software Engineer JEE
Inscription : avril 2002
Messages : 744
Détails du profil
Informations personnelles :
Nom : Homme Stessy Delcroix
Âge : 37
Localisation : Belgique

Informations professionnelles :
Activité : Senior Software Engineer JEE
Secteur : Finance

Informations forums :
Inscription : avril 2002
Messages : 744
Points : 1 092
Points : 1 092
Et le vainqueur est ....

Roulement de tambour

laurentschneider

Complètement idiot que je n'avais même pas pensé mettre des parenthèses pour chaque requête.

J'avais utilisé la même manière que toi mais sans les parenthèses

Code :
1
2
3
4
5
6
INSERT INTO table1 (col1,col2,col3) 
VALUES (
  SELECT t2 FROM table2 WHERE t3 = 10, 
 SELECT t4 FROM table3 WHERE t5 = 20, 
  SELECT t6 FROM table4 WHERE t7 = 40
);
En tout cas merci beaucoup à vous tous.

Problème résolu je pense
__________________
Langages : Java, SQL
Outils : Eclipse, Intellij
SGBD : Oracle, PostgreSQL
Mes Articles
Stessy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2008, 13h44   #10
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 319
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 319
Points : 5 837
Points : 5 837
Citation:
Envoyé par orafrance Voir le message
sauf erreur cette solution provoquera un produit cartésien donc bien plus de ligne qu'attendue non ?
Bien sûr ! Mais qui peut dire que c'est incorrecte ?
L'autre solution marché que si le nombre des enregistrements du chaque select est égal à 1. Et comme 1 multiplie par 1 fait 1 voila que le produit cartésien est correcte.
Je saurais gré à Stessy qu'il nous explique pour quoi cette solution est bonne à parte le fait que son code est proche de celui de Laurent.
mnitu 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 18h49.


 
 
 
 
Partenaires

Hébergement Web