2011-12-15 4 views
2

Je travaille avec des données sur le serveur SQL. Une table a 4 lignes identiques et n'a pas de clé primaire. Je souhaite mettre à jour une rangée de ces 4 peut être une rangée supérieure.Mise à jour Top requête

Est-ce possible? J'ai essayé de le faire en manipulant des requêtes de mise à jour de beaucoup de manières, mais rien ne fonctionne ...

+0

Pouvez-vous pas ajouter des clés primaires pour les lignes? –

+0

Votre question est source de confusion. S'il vous plaît nous montrer vos données d'origine et ce que vous voulez l'avoir comme. –

+0

@benni_mac_b pas si les enregistrements sont purement identiques. –

Répondre

0

Il existe une fonctionnalité non prise en charge non documentée de %% physloc %% dans SQL Server 2008 qui peut être équivalente à RowId. Je pense que nous devrions pouvoir utiliser cela.

Références Code Project Link

--Solution (non testé) En supposant que nous avons une table Table1 avec deux colonnes Col1 et Col2

UPDATE TABLE1 
SET COL1 = New_Value1, 
    COL2 = NEW_Value2 
WHERE %%physloc%% IN 
(
    SELECT PhysicalLocation 
     FROM (
      SELECT %%physloc%% As PhysicalLocation, 
        ROW_NUMBER() Over (Partition By Col1,Col2 Order By Col1,Col2) As RowNumber 
       FROM TABLE1) AS T 
    WHERE RowNumber = 1 
) 
3

http://msdn.microsoft.com/en-us/library/ms177523.aspx

La fonction TOP peut être inclus dans un requête pour limiter le nombre d'entrées mises à jour par une requête UPDATE. Dans ce cas, une requête pourrait être créée en ajoutant une clause WHERE à la requête qui inclut tous les champs d'identification pour les correspondances attendues et utiliser la fonction TOP comme indiqué précédemment. Par exemple:

some_table[ 
    field1, 
    field2, 
    field3 
] 

UPDATE TOP(1) some_table 
    SET field1 = @value1, field2 = @value2, field3 = @value3 
    WHERE 
    field1 = @currentValue1 AND 
    field2 = @currentValue2 AND 
    field3 = @currentValue3; 
1

Si vous ne vous souciez pas de ce que vous obtenez, vous pouvez faire l'une des deux choses (simples).

Utilisez ROW_NUMBER() pour créer un nombre unique par ligne au moment de la compilation ou ajoutez un champ à la table qui identifiera chaque ligne. Exemple de code pour les deux est ci-dessous.

CREATE TABLE #blah (Cola char(1), Colb char(1)) 

INSERT INTO #blah 
VALUES 
('a','b'), 
('a','b'), 
('b','c') 

SELECT * FROM #blah 

SELECT *, ROW_NUMBER() OVER (ORDER BY Cola) 
FROM #blah 

ALTER TABLE #blah 
ADD IdField INT IDENTITY 

SELECT * 
FROM #blah 

DROP TABLE #blah 

Pour une solution permanente, vous devriez aller avec le champ Identity. S'il s'agit d'une opération ponctuelle, l'option Row_Number() devrait fonctionner.

0

Vous avez table comme ce

enter image description here

Et vous voulez mettre à jour une première ligne pour chaque lignes en double

  1. Créer nouvelle colonne comme celui-ci

    alter table TestTable 
    Add RowID bigint identity(-9223372036854775808, 1) not null; 
    
  2. mettre à jour une première ligne pour chaque ligne dupliquée

    UPDATE TestTable SET Col2 = NULL 
        WHERE RowID IN (
        SELECT * 
        FROM (
         select *, ROW_NUMBER() over (partition BY Col1 order by Col1) rnum 
         from TestTable 
        ) T 
        WHERE T.rnum = 1