2016-11-07 1 views
-1

Je suis en train de mettre à jour une colonne de table à partir d'une colonne de table dans une autre table et je suis en utilisant le code suivant - il génère l'erreur ci-dessous.jointure interne mise à jour

Des idées?

UPDATE URLRecord 

SET URLRecord.Slug = aaNewURLSlugss.NewSlugName DE URLRecord INNER JOIN aaNewURLSlugs SUR URLRecord.Slug = aaNewURLSlugss.OldSlugName

Erreur:

Msg 102, Level 15, State 1, Line 1
Incorrect syntax near ','.

+7

Il n'y a pas de virgule dans le code. Donc, cela rend très improbable ce message d'erreur. –

+0

Vérifiez ci-dessus et en dessous de votre déclaration .... peut-être que la virgule est tapi de code commenté, ou ne supprime pas complètement. – scsimon

+0

essayer de mettre une déclaration de non-sens avant et après la mise à jour comme 'select « avant update'' et 'sélectionner » après update'' cela devrait nous faire savoir si le problème est ailleurs. Si vous exécutez * studio de gestion *, ouvrez une nouvelle requête et exécutez l'instruction update ici. – TheVillageIdiot

Répondre

-1

Essayez d'utiliser SQL embarqué comme celui-ci :

UPDATE URLRecord 
    SET Slug = (
    SELECT NewSlugName 
    FROM aaNewURLSlugs 
    WHERE URLRecord.Slug = aaNewURLSlugs.OldSlugName) 
WHERE Slug IN (SELECT OldSlugName FROM aaNewURLSlugs) 
+0

Cela mettra à jour chaque ligne de 'URLRecord' à la même valeur. – Eric

+0

Je ne pense pas. – quantummind

+0

Soit c'est le cas ou non. Je vous suggère de le tester vous-même @quantummind et d'utiliser ces apprentissages pour de futures publications. –

-1

Utilisez des alias

UPDATE A 
SET A.Slug = B.NewSlugName 
FROM URLRecord AS A 
INNER JOIN aaNewURLSlugs B 
ON A.Slug = B.OldSlugName 
+1

Surprenant que cela obtient upvotes, parce que cela ne fonctionne pas. –

+0

Pourquoi les alias changeraient-ils quelque chose? – Ryan

0

SQL Server n'aime pas le nom de colonne qualifié SET. Est-ce que ça marche?

UPDATE r 
    SET Slug = n.NewSlugName 
FROM URLRecord r inner join 
    aaNewURLSlugs n 
    ON r.Slug = n.OldSlugName; 

Le message d'erreur serait différent, cependant, de ce que vous obtenez. Ce serait une erreur supplémentaire.

+0

@ MichaelJ.Gray. . . Le "SELECT" était une faute de frappe, et j'ai abordé le problème du PO dans un commentaire. –

+0

@ MichaelJ.Gray. . . Votre commentaire concerne une faute de frappe dans la réponse originale.Le mot "SELECT" aurait dû être et est maintenant "SET". –

0

Voici une solution de travail qui utilise une table temporaire. Ce n'est peut-être pas idéal et j'ai inclus quelques instructions de dépôt, donc ne l'exécutez pas sur votre machine de production.

-- Build our test tables 
CREATE TABLE [URLRecord] 
(
    [Id] INTEGER IDENTITY PRIMARY KEY, 
    [Slug] CHARACTER VARYING(255) NOT NULL 
) 

GO 

CREATE TABLE [NewSlugs] 
(
    [Id] INTEGER IDENTITY PRIMARY KEY, 
    [NewSlugName] CHARACTER VARYING(255) NULL, 
    [OldSlugName] CHARACTER VARYING(255) NULL 
) 

GO 

-- Insert test data 
INSERT INTO [URLRecord] VALUES ('Original Name'); 
INSERT INTO [NewSlugs] VALUES ('New Name', 'Original Name'); 

-- Populate work table with the records we want to modify 
SELECT [URLRecord].[Id], [NewSlugs].[NewSlugName] INTO #SlugWork 
FROM [URLRecord] 
INNER JOIN [NewSlugs] ON [URLRecord].[Slug] = [NewSlugs].[OldSlugName] 

-- We're just echoing here 
SELECT * FROM #SlugWork 

-- Pull everything from our temporary table and update modified records 
UPDATE [URLRecord] 
SET [URLRecord].[Slug] = [T].[NewSlugName] 
FROM #SlugWork AS [T] 
WHERE [T].[Id] = [URLRecord].[Id] 

-- Proving it's updated 
SELECT * FROM [URLRecord] 

-- Drop our example stuff, for rerunnability 
DROP TABLE #SlugWork 
DROP TABLE [NewSlugs] 
DROP TABLE [URLRecord]