2010-07-02 8 views
2

J'essaie de mettre à jour toutes les lignes SQL dans la table [Temp_LTGData] en définissant la valeur [CORP_REG_NO] à la valeur d'une autre ligne dans la même table où le [NUMÉRO CLIENT] correspond.SQL Comment puis-je mettre à jour comme ça?

Finalement, je dois le faire avec quelques colonnes, est-ce que quelqu'un sait si cela peut être fait?

Je ne peux pas sembler utiliser l'alias LTGSource comme dans une requête select :(

Update [MandS].[dbo].[Temp_LTGData] LTGSource 
    Set [CORP_REG_NO] = (SELECT [CORP_REG_NO] 
          FROM [MandS].[dbo].[Temp_LTGData] 
          WHERE ([CORP_REG_NO] IS NULL 
          AND [CUSTOMER_NUMBER] = LTGSource.[CUSTOMER_NUMBER])) 
    where [CORP_REG_NO] IS NULL 

Merci pour les gars de rétroaction qui est quelque chose de vraiment génial, j'ai même appris quelques approches différentes à ce problème (Voté pour vous tous).

Répondre

2

Essayez ce qui suit pour obtenir exactement ce que vous faisiez

UDPATE [MandS].[dbo].[Temp_LTGData] LTGSource 
SET [CORP_REG_NO] = (SELECT [CORP_REG_NO] 
        FROM [MandS].[dbo].[Temp_LTGData] 
        WHERE ([CORP_REG_NO] IS NULL 
          AND [CUSTOMER_NUMBER] = ToUpdate.[CUSTOMER_NUMBER])) 
FROM {MandS].[dbo].[Temp_LTGData] ToUpdate 
where [CORP_REG_NO] IS NULL 

Cependant, vous avez une erreur dans votre requête, je crois que le sous-requête devrait être IS NULL.

+0

Spot sur ... !!! – War

1

Essayez ceci:

UPDATE Temp_LTGData LTGSource 
    SET Col1 = L2.Col1, Col2 = L2.Col2, Col3 = L2.Col3 
FROM LTGSource L1 
JOIN LTGSource L2 ON L2.CORP_REG_NO IS NOT NULL AND L1.CUSTOMER_NUMBER = L2.CUSTOMER_NUMBER 
WHERE L1.CORP_REG_NO IS NULL 

Cela devrait le faire pour vous. Vous joignez la table pouvant être mise à jour à elle-même afin de pouvoir accéder à la fois à l'ancienne ligne et à la nouvelle ligne pour la mise à jour. De cette façon, vous pouvez mettre à jour plusieurs colonnes à la fois.

2

Quelque chose comme ce qui vous permettra de faire face à de nombreuses colonnes avec une source et la ligne cible

Si vous avez besoin de relier différentes lignes pour différentes colonnes, il est plus complexe

Si je comprends bien, le filtrage à CORP_REG_NO IS NULL ne fonctionnerait bien sûr que pour CORP_REG_NO, donc vous ne voulez pas filtrer sauf pour restreindre les lignes cibles et les sources indépendamment des filtres de colonnes spécifiques selon votre question.

Update 
    target 
Set 
    [CORP_REG_NO] = CASE WHEN target.[CORP_REG_NO] IS NULL THEN source.[CORP_REG_NO] ELSE target.[CORP_REG_NO] END, 
    ...and again... 
FROM 
    [MandS].[dbo].[Temp_LTGData] target 
    JOIN 
    [MandS].[dbo].[Temp_LTGData] source ON target.[CUSTOMER_NUMBER] = source.[CUSTOMER_NUMBER] 
WHERE 
    a filter to restrict rows perhaps 
+0

+1 jolis noms d'alias –

+0

Je ne peux pas joindre cette table sur elle-même car les enregistrements de cette table sont le résultat d'une jointure entre 4 tables d'un emplacement distant, je dois exécuter la requête ci-dessus pour m'assurer enregistre quand je divise les données en arrière dans les 4 tables pour le traitement. Sinon, c'est l'approche que je prendrais normalement. Cela dit, cela rend la vie plus simple d'ajouter simplement une clé primaire puis de se joindre à cela, ce qui en fait la solution la plus efficace. – War