J'essaie d'insérer une table dans une autre en utilisant l'entrée d'une autre table. Bien que cela soit tout à fait possible pour de nombreux moteurs de base de données, j'ai toujours du mal à me souvenir de la syntaxe correcte pour le moteur SQL
du moment ([MySQL][1], [Oracle][2], [SQL Server][3], [Informix][4] et [DB2][5]).
Existe-t-il une syntaxe miracle issue d'une norme SQL (par exemple, [SQL-92][6]) qui me permettrait d'insérer les valeurs sans me soucier de la base de données sous-jacente ?
[1] : http://en.wikipedia.org/wiki/MySQL [2] : http://en.wikipedia.org/wiki/Oracle_Database [3] : http://en.wikipedia.org/wiki/Microsoft_SQL_Server [4] : http://en.wikipedia.org/wiki/IBM_Informix [5] : http://en.wikipedia.org/wiki/IBM_DB2 [6] : http://en.wikipedia.org/wiki/SQL-92
Essayez :
INSERT INTO table1 ( column1 )
SELECT col1
FROM table2
Il s'agit d'un code SQL ANSI standard qui devrait fonctionner avec n'importe quel SGBD.
Il fonctionne définitivement pour :
@Shadow_x99 : Cela devrait fonctionner correctement, et vous pouvez également avoir plusieurs colonnes et d'autres données :
INSERT INTO table1 ( column1, column2, someInt, someVarChar )
SELECT table2.column1, table2.column2, 8, 'some string etc.'
FROM table2
WHERE table2.ID = 7;
Edit : Je dois mentionner que je n'ai utilisé cette syntaxe qu'avec Access, SQL 2000/2005/Express, MySQL, et PostgreSQL, donc ceux-là devraient être couverts. Un commentateur a fait remarquer que cela fonctionnera avec SQLite3.
Les deux réponses que je vois fonctionnent bien dans Informix spécifiquement, et sont fondamentalement du SQL standard. C'est-à-dire, la notation :
INSERT INTO target_table[(<column-list>)] SELECT ... FROM ...;
fonctionne bien avec Informix et, je pense, avec tous les SGBD. (Il y a 5 ans ou plus, c'est le genre de chose que MySQL ne supportait pas toujours ; il a maintenant un support décent pour ce genre de syntaxe SQL standard et, AFAIK, il fonctionnerait bien avec cette notation). La liste des colonnes est facultative mais elle indique les colonnes cibles dans l'ordre, de sorte que la première colonne du résultat du SELECT ira dans la première colonne listée, etc. En l'absence de liste de colonnes, la première colonne du résultat du SELECT est placée dans la première colonne de la table cible.
Ce qui peut différer d'un système à l'autre, c'est la notation utilisée pour identifier les tables dans les différentes bases de données - la norme n'a rien à dire sur les opérations inter-bases de données (et encore moins inter-SGBD). Avec Informix, vous pouvez utiliser la notation suivante pour identifier une table :
[dbase[@server]:][owner.]table
C'est-à-dire que vous pouvez spécifier une base de données, en identifiant éventuellement le serveur qui héberge cette base de données si elle n'est pas dans le serveur actuel, suivi d'un propriétaire optionnel, d'un point, et enfin du nom de la table proprement dite. La norme SQL utilise le terme schéma pour ce qu'Informix appelle le propriétaire. Ainsi, dans Informix, l'une des notations suivantes pourrait identifier une table :
table
"owner".table
dbase:table
dbase:owner.table
dbase@server:table
dbase@server:owner.table
Le propriétaire en général n'a pas besoin d'être cité ; cependant, si vous utilisez des guillemets, vous devez faire en sorte que le nom du propriétaire soit correctement orthographié - il devient sensible à la casse. C'est-à-dire :
someone.table
"someone".table
SOMEONE.table
identifient tous la même table. Avec Informix, il y a une légère complication avec les bases de données MODE ANSI, où les noms de propriétaires sont généralement convertis en majuscules (Informix est l'exception). C'est-à-dire que dans une base de données MODE ANSI (peu utilisée), vous pourriez écrire :
CREATE TABLE someone.table ( ... )
et le nom du propriétaire dans le catalogue système serait "SOMEONE", plutôt que "someone". Si vous placez le nom du propriétaire entre guillemets doubles, il se comporte comme un identificateur délimité. Avec le langage SQL standard, les identificateurs délimités peuvent être utilisés à de nombreux endroits. Avec Informix, vous ne pouvez les utiliser qu'autour des noms de propriétaires -- dans d'autres contextes, Informix traite les chaînes entre guillemets simples et doubles comme des chaînes, plutôt que de séparer les chaînes entre guillemets simples comme des chaînes et les chaînes entre guillemets doubles comme des identificateurs délimités. (Bien sûr, juste pour être complet, il existe une variable d'environnement, DELIMIDENT, qui peut être définie - à n'importe quelle valeur, mais Y est la plus sûre - pour indiquer que les guillemets doubles entourent toujours les identificateurs délimités et les guillemets simples entourent toujours les chaînes de caractères).
Notez que MS SQL Server parvient à utiliser des [identificateurs délimités] entre crochets. Cela me semble bizarre et ne fait certainement pas partie de la norme SQL.