2013-06-03 10 views
3

Voici la chose: J'ai 2 bases de données ADatabaseCX et ADatabaseRH. Les bases de données sont les mêmes. J'ai quelques enregistrements dans les deux datatables. Ce que je voudrais faire est insérer des entrées de ADatabaseCX à ADatabaseRH, mais seulement des entrées, qui n'existe pas dans ADatabaseRH - dans RH il y a des données incomplètes.Copie SQL enregistrements uniques entre deux bases de données égales dans deux bases de données distinctes

J'ai essayé avec SQL imbriqué, quelque chose comme ceci:

SELECT a.* 
    FROM ADatabaseCX.dbo.Recipes AS a 
    LEFT JOIN ADatabaseRH.dbo.Recipes AS b ON (ADatabaseCX.dbo.Recipes.recipeId = ADatabaseRH.dbo.Recipes.recipeId) 
    WHERE b.recipeId IS NULL 

Mais il dit

Msg 4104, Level 16, State 1, Line 3 
    The multi-part identifier "ADatabaseCX.dbo.Recipes.recipeId" could not be bound. 
    Msg 4104, Level 16, State 1, Line 3 
    The multi-part identifier "ADatabaseRH.dbo.Recipes.recipeId" could not be bound. 

Fist (première idée) J'ai essayé

SELECT * FROM ADatabaseCX.dbo.Recipes 
    WHERE NOT EXISTS (SELECT recipeId FROM ADatabaseRH.dbo.Recipes) 

Mais cela me retourne pas enregistrements. Pendant la copie, je voudrais également copier de manière à ce que les ID restent les mêmes. J'utilise MS SQL Server 2008. Toute aide serait grandement appréciée.

Répondre

1

Le problème est que vous initialisez un ALIAS sur le nom de la base de données, mais vous pas utilisé dans la clause ON, il devrait être

SELECT a.* 
FROM ADatabaseCX.dbo.Recipes AS a 
     LEFT JOIN ADatabaseRH.dbo.Recipes AS b 
      ON a.recipeId = b.recipeId 
WHERE b.recipeId IS NULL 

Le nom de la base de données et le nom de la table ne sont plus valables après l'initialisation d'un ALIAS sur chacun d'eux, c'est pourquoi vous obtenez ce message d'erreur.

+0

Merci! J'ai marqué votre message comme réponse puisque vous étiez le premier à répondre. Merci encore. – CyberHawk

1

Essayez d'utiliser cette référence a.recipeId et b.recipeId:

SELECT a.* 
FROM ADatabaseCX.dbo.Recipes AS a 
LEFT JOIN ADatabaseRH.dbo.Recipes AS b ON a.recipeId = b.recipeId 
WHERE b.recipeId IS NULL 

Ou cela fonctionnerait aussi en utilisant NOT IN:

SELECT * 
FROM ADatabaseCX.dbo.Recipes 
WHERE recipeId NOT IN (
    SELECT recipeId 
    FROM ADatabaseRH.dbo.Recipes 
) 
+0

Merci pour votre réponse. Puisque je pourrais marquer seulement un poteau comme réponse (puisque c'est la réponse correcte aussi) je mettrai en valeur votre poteau. Merci! – CyberHawk

+0

@CyberHawk - pas de soucis, heureux que nous pourrions aider! – sgeddes

1

Le problème avec votre requête est que vous avez aliasé les tables mais que vous n'avez pas utilisé ces alias dans la jointure.

Essayez ceci:

SELECT a.* 
FROM ADatabaseCX.dbo.Recipes AS a 
    LEFT JOIN ADatabaseRH.dbo.Recipes AS b ON (a.recipeId = b.recipeId) 
WHERE b.recipeId IS NULL 

Edit: quelques minutes de retard sur ce par les regards de celui-ci!

+0

Merci pour votre réponse. Puisque je pourrais marquer seulement un poteau comme réponse je mettrai en valeur votre poteau (puisque c'est réponse aussi). Merci! – CyberHawk

Questions connexes