2009-02-12 8 views
1

je l'ai besoin de copier toutes les données de B_Table à A_Table, avec une instruction SQL Contraindreinstruction d'insertion SQL avec select

INSERT INTO A_Table (field1, field2) 
    SELECT field1, field2 FROM B_Table 
    WHERE field1 NOT IN (
    SELECT field1 FROM A_Table); 

suivant essentiellement,: field1 de B_Table ne pas exister dans A_Table. J'ai besoin d'ajouter cette contrainte puisque field1 est une clé.

Cela ressemble à un conflit: field1 pas dans A_Table étant copié de B_Table à A_Table. Pendant le processus d'insertion, l'enregistrement copié de B_Table existera dans A_Table. Vous ne savez pas si cela fonctionne ou pas, ou un résultat inattendu?

Peut-être que c'est OK. Le dernier SELECT est mis en cache dans une table temporaire et n'est pas actualisé lors de l'insertion?

Par ailleurs, mon serveur SQL est Microsoft SQL Server 2005.

Répondre

0

Eh bien il semble que cette requête ne fonctionnerait pas sous sa forme actuelle parce que vous ne spécifiez pas une colonne dans votre sous requête. Très probablement, il est toujours en cours d'exécution et il suppose que vous voulez dire not in (null)

1

Les instructions SQL sont exécutées comme si tout se produisait instantanément. Il n'y a aucun moment où (logiquement parlant) l'instruction a été partiellement exécutée.

1

Le jeu de résultats du SELECT est déterminé avant toute insertion, il n'y a donc pas de conflit. Sinon, de telles déclarations ne seraient jamais en sécurité. Il est un peu comme le code:

x = 1; 
x = x + x + 1; 

Le côté droit est évalué, et seulement ensuite affecté à la variable du côté gauche - sinon qui sait comment x finiraient!

0

Cela devrait fonctionner correctement.

Vous devriez toujours avoir un environnement de test configuré où vous pouvez essayer des choses pour voir ce qui se passe. Vous ne voulez jamais compter sur les conseils d'étrangers avant de vous ruiner votre base de données!

4

peut-être il vous aidera si vous regardez vous interrogez que sur deux déclarations distinctes

l'instruction select

SELECT field1, field2 FROM B_Table 
    WHERE field1 NOT IN (
    SELECT field1 FROM A_Table) 

qui vous donne des résultats

maintenant vous insérez ces résultats dans votre table A_table

INSERT INTO A_Table (field1, field2) 

et le code pour y parvenir est

INSERT INTO A_Table (field1, field2) 
    SELECT field1, field2 FROM B_Table 
    WHERE field1 NOT IN (
    SELECT field1 FROM A_Table) 

qui est essentiellement ce que vous avez posté

1

votre instruction d'insertion fonctionnera comme démontré par ce SQL -

CREATE TABLE #temp1 (id INT IDENTITY(1,1) PRIMARY KEY CLUSTERED , [name] NVARCHAR(20)) 
CREATE TABLE #temp2 (id INT IDENTITY(1,1) PRIMARY KEY CLUSTERED , [name] NVARCHAR(20)) 

INSERT INTO #temp1 ([name]) 
VALUES ('name1') 
INSERT INTO #temp1 ([name]) 
VALUES ('name2') 
INSERT INTO #temp1 ([name]) 
VALUES ('name3') 
INSERT INTO #temp1 ([name]) 
VALUES ('name4') 
INSERT INTO #temp2 ([name]) 
VALUES ('Othername1') 
INSERT INTO #temp2 ([name]) 
VALUES ('Othername2') 

INSERT INTO #temp2 (name) 
SELECT name FROM #temp1 
WHERE id NOT IN (SELECT id FROM #temp2) 

SELECT * FROM #temp1 
SELECT * FROM #temp2 

DROP TABLE #temp1 
DROP TABLE #temp2 

résultats dans

temp1

nom d'utilisateur

1 nom1
2 name2
3 nom3
4 nom4

temp2

nom identifiant

1 Othername1
2 Othername2
3 nom3
4 nom4

Questions connexes