J'essaye INSERT INTO
une table utilisant l'entrée d'une autre table. Bien que cela soit entièrement réalisable pour de nombreux moteurs de base de données, je semble toujours avoir du mal à me souvenir de la syntaxe correcte pour le SQL
moteur du jour ( MySQL , Oracle , SQL Server , Informix et DB2 ).
Existe-t-il une syntaxe miracle provenant d'un standard SQL (par exemple, SQL-92 ) qui me permettrait d'insérer les valeurs sans se soucier de la base de données sous-jacente?
sql
database
syntax
database-agnostic
ansi-sql-92
Claude Houle
la source
la source
Réponses:
Essayer:
Il s'agit d'un SQL ANSI standard et devrait fonctionner sur n'importe quel SGBD
Cela fonctionne certainement pour:
la source
La réponse de Claude Houle : devrait bien fonctionner, et vous pouvez également avoir plusieurs colonnes et d'autres données:
Je n'ai utilisé cette syntaxe qu'avec Access, SQL 2000/2005 / Express, MySQL et PostgreSQL, donc ceux-ci devraient être couverts. Il devrait également fonctionner avec SQLite3.
la source
Pour obtenir une seule valeur dans une valeur multi
INSERT
d'une autre table, j'ai fait ce qui suit dans SQLite3:la source
INSERT
est soitVALUES
uneSELECT
instruction, mais pas les deux.INSERT INTO ... VALUES ([expr], [expr], ...)
et l'un des chemins d'accès[expr]
est{{NOT} EXISTS} ([select-stmt])
- notez que les paranthèses autour de l'instruction select sont obligatoires ({}
ce qui signifie facultatif)Les deux réponses que je vois fonctionnent correctement dans Informix en particulier, et sont essentiellement du SQL standard. Autrement dit, la notation:
fonctionne très bien avec Informix et, je suppose, 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 type de syntaxe SQL standard et, AFAIK, cela fonctionnerait bien sur cette notation.) La liste des colonnes est facultatif mais indique les colonnes cibles dans l'ordre, donc la première colonne du résultat du SELECT ira dans la première colonne listée, etc. En l'absence de la liste des colonnes, la première colonne du résultat du SELECT va dans le première colonne de la table cible.
Ce qui peut être différent entre les systèmes, c'est la notation utilisée pour identifier les tables dans 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:
Autrement dit, vous pouvez spécifier une base de données, en identifiant éventuellement le serveur qui héberge cette base de données s'il ne se trouve pas dans le serveur actuel, suivi d'un propriétaire facultatif, d'un point, et enfin du nom réel de la table. Le standard SQL utilise le terme schéma pour ce que Informix appelle le propriétaire. Ainsi, dans Informix, l'une des notations suivantes pourrait identifier une table:
Le propriétaire en général n'a pas besoin d'être cité; cependant, si vous utilisez des guillemets, vous devez obtenir le nom du propriétaire correctement orthographié - il devient sensible à la casse. C'est:
tous identifient le même tableau. Avec Informix, il y a une légère complication avec les bases de données MODE ANSI, où les noms des propriétaires sont généralement convertis en majuscules (informix est l'exception). Autrement dit, dans une base de données MODE ANSI (peu utilisée), vous pouvez écrire:
et le nom du propriétaire dans le catalogue système serait "QUELQU'UN", plutôt que "quelqu'un". Si vous mettez le nom du propriétaire entre guillemets, il agit comme un identificateur délimité. Avec SQL standard, les identifiants délimités peuvent être utilisés à de nombreux endroits. Avec Informix, vous pouvez les utiliser uniquement 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 en tant que chaînes et les chaînes entre guillemets doubles en tant qu'identificateurs délimités. (Bien sûr, juste pour être complet, il existe une variable d'environnement, DELIMIDENT, qui peut être définie - sur 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.)
Notez que MS SQL Server parvient à utiliser des [identificateurs délimités] entre crochets. Cela me semble bizarre et ne fait certainement pas partie du standard SQL.
la source
Pour ajouter quelque chose dans la première réponse, lorsque nous voulons seulement quelques enregistrements d'une autre table (dans cet exemple un seul):
la source
La plupart des bases de données suivent la syntaxe de base,
Chaque base de données que je l' ai utilisé suivre cette syntaxe à savoir
DB2
,SQL Server
,MY SQL
,PostgresQL
la source
Au lieu d'une
VALUES
partie de laINSERT
requête, utilisez simplement laSELECT
requête comme ci-dessous.la source
Deux approches pour insérer dans avec sous-requête de sélection.
1. Approche pour la sous-requête With SELECT renvoyant des résultats avec une ligne .
Dans ce cas, il suppose que la sous-requête SELECT ne renvoie qu'une seule ligne de résultat en fonction de la condition WHERE ou des fonctions d'agrégation SQL telles que SUM, MAX, AVG etc. Sinon, elle générera une erreur
2. Approche pour la sous-requête With SELECT renvoyant des résultats avec plusieurs lignes .
La deuxième approche fonctionnera pour les deux cas.
la source
Cela peut être fait sans spécifier les colonnes dans le
INSERT INTO
pièce si vous fournissez des valeurs pour toutes les colonnes de laSELECT
pièce.Disons que table1 a deux colonnes. Cette requête devrait fonctionner:
Cela NE FONCTIONNERAIT PAS (valeur pour
col2
n'est pas spécifiée):J'utilise MS SQL Server. Je ne sais pas comment les autres RDMS fonctionnent.
la source
Voici un autre exemple utilisant des valeurs avec select:
la source
Insertion simple lorsque la séquence des colonnes du tableau est connue:
Colonne mentionnant l'insertion simple:
Insertion en masse lorsque le nombre de colonnes sélectionnées d'une table (# table2) est égal à la table d'insertion (Table1)
Insertion en masse lorsque vous souhaitez insérer uniquement dans la colonne souhaitée d'une table (table1):
la source
Voici un autre exemple où la source est prise à l'aide de plusieurs tables:
la source
Utilisez simplement des parenthèses pour la clause SELECT dans INSERT. Par exemple, comme ceci:
la source
Voici comment insérer à partir de plusieurs tables. Cet exemple particulier est où vous avez une table de mappage dans un scénario plusieurs à plusieurs:
(Je me rends compte que la correspondance sur le nom de l'élève peut renvoyer plus d'une valeur, mais vous obtenez l'idée. La correspondance sur autre chose qu'un ID est nécessaire lorsque l'ID est une colonne d'identité et est inconnue.)
la source
Cela fonctionne sur tous les SGBD
la source
Vous pouvez essayer ceci si vous souhaitez insérer toutes les colonnes à l'aide de la
SELECT * INTO
table.la source
Je préfère en fait ce qui suit dans SQL Server 2008:
Il élimine l'étape d'ajout de l'ensemble Insert () et vous sélectionnez simplement les valeurs qui vont dans le tableau.
la source
Cela a fonctionné pour moi:
La phrase est un peu différente de celle d'Oracle.
la source
Pour Microsoft SQL Server, je recommanderai d'apprendre à interpréter le SYNTAX fourni sur MSDN. Avec Google, il est plus facile que jamais de rechercher la syntaxe.
Pour ce cas particulier, essayez
Le premier résultat sera http://msdn.microsoft.com/en-us/library/ms174335.aspx
faites défiler jusqu'à l'exemple ("Utilisation des options SELECT et EXECUTE pour insérer des données d'autres tables") si vous avez du mal à interpréter la syntaxe donnée en haut de la page.
Cela devrait s'appliquer à tout autre SGBDR disponible sur place. Il est inutile de se souvenir de toute la syntaxe pour tous les produits IMO.
la source
la source
Semble bien, mais ne fonctionne que si tmp n'existe pas (le crée et le remplit). (Serveur SQL)
Pour insérer dans la table tmp existante:
la source
Meilleure façon d'insérer plusieurs enregistrements à partir d'autres tables.
la source
Si vous utilisez la route INSERT VALUES pour insérer plusieurs lignes, assurez-vous de délimiter les VALEURS en ensembles à l'aide de parenthèses, donc:
Sinon, MySQL objecte que "le nombre de colonnes ne correspond pas au nombre de valeurs à la ligne 1", et vous finissez par écrire un article trivial lorsque vous savez enfin quoi faire à ce sujet.
la source
SI vous souhaitez insérer des données dans une table sans écrire le nom de la colonne.
Où sont les tableaux:
Résultat:
la source
Dans informix, cela fonctionne comme Claude l'a dit:
la source
Postgres prend en charge ensuite: créer la table company.monitor2 en tant que select * from company.monitor;
la source