Insert into ... valeurs ( SELECT ... from ... )
Je suis en train de INSERT INTO
une table à l'aide de l'entrée à partir d'une autre table. Bien que ce est tout à fait possible pour de nombreux moteurs de base de données, j'ai toujours l'impression de mal à vous souvenir de la syntaxe correcte pour la SQL
moteur de la journée (MySQL, Oracle, SQL Server, Informix, et DB2).
Est-il de l'argent-balle syntaxe à venir à partir 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?
- cet exemple fonctionne: insert into tag_zone select @tag,zoneid,GETDATE(),@positiong.STIntersects(polygone) à partir de la zone de
Vous devez vous connecter pour publier un commentaire.
Essayer:
C'est la norme ANSI SQL et devrait fonctionner sur n'importe quel SGBD
Il travaille certainement pour:
@Shadow_x99: Qui devrait fonctionner correctement, et vous pouvez également avoir plusieurs colonnes et d'autres données:
Edit: je tiens à préciser que je n'ai utilisé cette syntaxe avec Access, SQL 2000/2005/Express, MySQL et PostgreSQL, de sorte que ceux-ci devraient être couverts. Un intervenant a souligné qu'il va travailler avec SQLite3.
Pour obtenir une seule valeur à une valeur multiple
INSERT
partir d'une autre table, je n'ai la suite dans SQLite3:INSERT
est soitVALUES
ou unSELECT
déclaration, pas les deux.INSERT INTO ... VALUES ([expr], [expr], ...)
et l'un des chemins d'accès dans[expr]
est{{NOT} EXISTS} ([select-stmt])
- à noter que la paranthesis autour de l'instruction select sont nécessaires ({}
sens facultatif)val2
peut avoir été un PK ou quelque autre champ unique de sorte qu'il n'est jamais venu.À la fois les réponses, je vois bien fonctionner dans Informix plus précisément, et sont essentiellement le standard SQL. Qui est, la notation:
fonctionne très bien avec Informix et, je l'espère, tous les SGBD. (Une fois sur 5 ans ou plus, c'est le genre de chose que MySQL n'a pas toujours l'appui; il a maintenant bon support pour ce genre de la syntaxe SQL standard et, autant que je sache, ce serait OK sur cette notation.) La liste des colonnes est facultatif, mais indique la cible des colonnes dans l'ordre, de sorte que la première colonne du résultat de la sélection sera d'aller dans la liste de la colonne, etc. En l'absence de la liste des colonnes, la première colonne du résultat de la sélection va dans la première colonne de la table cible.
Ce qui peut être différent entre les systèmes est la notation utilisée pour identifier les tableaux dans les différentes bases de données - le standard n'a rien à dire à propos de l'inter-base de données (sans parler de l'inter-SGBD) opérations. Avec Informix, vous pouvez utiliser la notation suivante pour identifier une table:
Qui est, vous pouvez spécifier une base de données, éventuellement identifier le serveur qui héberge la base de données si elle n'est pas dans le serveur actuel, suivie par une option de propriétaire du, point, et, enfin, le véritable nom de la table. La norme SQL utilise le terme de schéma pour ce Informix appelle la propriétaire. Ainsi, dans Informix, de l'une des notations suivantes pourraient identifier un tableau:
Le propriétaire, en général, n'a pas besoin d'être cité; cependant, si vous utilisez des guillemets, vous avez besoin pour obtenir le nom du propriétaire correctement orthographié, il devient sensible à la casse. Qui est:
tous les identifier de la même table. Avec Informix, il y a une légère complication avec le MODE ANSI bases de données, d'où le nom du propriétaire sont généralement convertis en majuscules (informix est l'exception). C'est, dans un MODE ANSI base de données (qui ne sont pas couramment utilisé), vous pourriez écrire:
et le nom du propriétaire dans le catalogue système serait "QUELQU'un", plutôt que "quelqu'un". Si vous placez le nom du propriétaire dans les guillemets, il agit comme un identificateur délimité. Avec le standard SQL, délimité par des identificateurs peuvent être utilisés de nombreux endroits. Avec Informix, vous pouvez les utiliser uniquement autour des noms de propriétaire -- dans d'autres contextes, Informix traite à la fois unique cité et double-cité des chaînes des chaînes de caractères, plutôt que de séparer l'unique cité des chaînes, des chaînes et des double-chaînes entre guillemets comme identificateurs délimités. (Bien sûr, juste pour être complet, il y a une variable d'environnement, DELIMIDENT, qui peut être réglé à une valeur quelconque, mais Y est plus sûr - pour indiquer que les guillemets toujours surround délimité par des identificateurs et des apostrophes toujours entourer les chaînes.)
Noter que MS SQL Server gère à utiliser [délimité par des identificateurs] entre crochets. Il semble bizarre pour moi, et ce n'est certainement pas partie de la norme SQL.
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 plupart des bases de données de suivre la syntaxe de base,
Chaque base de données, j'ai utilisé de suivre cette syntaxe à savoir,
DB2
,SQL Server
,MY SQL
,PostgresQL
Cela peut être fait sans spécifier les colonnes de la
INSERT INTO
partie si vous êtes à fournir des valeurs pour toutes les colonnes de laSELECT
partie.Disons table1 a deux colonnes. Cette requête devrait fonctionner:
Ce ne SERAIT PAS de travail (valeur par
col2
n'est pas spécifié):Je suis à l'aide de MS SQL Server. Je ne sais pas comment les autres SGBDR travail.
Au lieu de
VALUES
partie deINSERT
requête, il suffit d'utiliserSELECT
requête comme ci-dessous.C'est un autre exemple à l'aide de valeurs à sélectionner:
Simple insertion lors de la colonne de la table de séquence est connue:
Insertion Simple de mentionner colonne:
En vrac d'insertion lorsque le nombre de colonnes d'une table(#table2) sont égales à l'insertion de la table(Table1)
En vrac d'insertion lorsque vous souhaitez insérer uniquement dans les colonnes d'une table(table1):
Voici un autre exemple de cas où la source est prise à l'aide de plus d'une table:
Voici comment insérer à partir de plusieurs tables. Cet exemple particulier est l'endroit où vous avez une table de mappage dans un de nombreux de nombreux scénario:
(Je me rends compte d'appariement sur le nom de l'élève peut retourner qu'une seule valeur, mais vous obtenez l'idée. Correspondance sur autre chose qu'un Id est nécessaire lorsque l'Id est une colonne d'Identité et est inconnu.)
Cela fonctionne sur tous les SGBD
Vous pouvez essayer cette option si vous souhaitez insérer des colonnes à l'aide de
SELECT * INTO
table.Cela a fonctionné pour moi:
La phrase est un peu différent de d'Oracle.
Pour Microsoft SQL Server, je vous recommande d'apprendre à interpréter la SYNTAXE fournie sur MSDN. Avec Google, c'est plus facile que jamais de regarder pour la syntaxe.
Pour ce cas particulier, essayez
Le premier résultat sera http://msdn.microsoft.com/en-us/library/ms174335.aspx
faites défiler vers le bas pour l'exemple ("à l'Aide de la SÉLECTIONNER et EXÉCUTER des options d'insertion de données à partir d'autres tables") si vous trouvez qu'il est difficile d'interpréter la syntaxe donnée en haut de la page.
Ce devrait être applicable pour toute autre SGBDR qui y sont disponibles. Il est inutile de se souvenir de l'ensemble de la syntaxe pour tous les produits de l'OMI.
Je préfère la suivante dans SQL Server 2008:
Il élimine l'étape de l'ajout de l'Insert () définie, et il vous suffit de sélectionner les valeurs qui vont dans le tableau.
Suffit d'utiliser les parenthèses pour SÉLECTIONNEZ clause à INSÉRER. Par exemple, comme ceci :
A l'air sympa, mais ne fonctionne que si tmp n'existe pas (le crée et remplit). (SQL server)
À insérer dans les tmp table:
Meilleure façon d'insérer plusieurs enregistrements à partir d'autres tables.
Deux approches pour l'insertion dans avec sélection de la sous-requête.
1. Approche pour Avec sous-requête SELECT retour des résultats avec une ligne.
Dans ce cas, il suppose de SÉLECTIONNER les Sous-requête retourne une seule ligne de résultat sur la base d'OÙ une condition ou d'agrégation SQL fonctions comme SUM, MAX, AVG, etc. Sinon, il va jeter erreur
2. Approche pour Avec sous-requête SELECT retour des résultats avec plusieurs lignes.
La deuxième approche de travail pour les deux cas.
Si vous allez l'INSÉRER des VALEURS de l'itinéraire pour insérer plusieurs lignes, assurez-vous de délimiter les VALEURS dans des ensembles à l'aide de parenthèses, donc:
Autrement les objets MySQL que "Column count doesn't match value count at row 1", et vous finissez par écrire un banal message lorsque vous enfin comprendre ce qu'il faut faire à ce sujet.