2011-12-15 2 views
2

Я работаю с некоторыми данными на сервере sql. Таблица имеет 4 одинаковых строки и не имеет первичного ключа. Я хочу обновить любую строку из этих 4, которая может быть верхней строкой.Update Top query

Возможно ли это? Я пытался сделать это, манипулируя запросами обновления многими способами, но ничего не работает ...

+0

Вы можете не добавлять первичные ключи для строк? –

+0

Ваш вопрос запутан. Пожалуйста, покажите нам свои исходные данные и то, что вы хотите иметь. –

+0

@benni_mac_b нет, если записи абсолютно идентичны. –

ответ

0

Существует недокументированная неподдерживаемая функция %% physloc %% в SQL Server 2008, которая может быть эквивалентна RowId. Думаю, мы сможем это использовать.

Список литературы Code Project Link

--Solution (непроверенные) Предположим, что мы имеем таблицу Table1 с двумя колоннами Col1 и 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

ТОП функция может быть включена в запрос, чтобы ограничить количество записей, обновляемых запросом UPDATE. В этом случае запрос может быть создан путем добавления предложения WHERE к запросу, включающего все идентифицирующие поля для ожидаемых совпадений и использования функции TOP, как отмечалось ранее. Например:

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

Если вам все равно, какой из них вы получите, вы можете сделать одно из двух простых действий.

Используйте команду ROW_NUMBER() для создания уникального числа в строке во время компиляции или добавьте поле в таблицу, которое будет идентифицировать каждую строку. Пример кода для обоих приведен ниже.

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 

Для постоянного решения, вы должны пойти с Identity поля. Если это одноразовая вещь, то опция Row_Number() должна работать.

0

У вас есть таблица, как этот

enter image description here

И вы хотите, чтобы обновить первую строку для каждого дублирующих строк

  1. Создать новый столбец как этот

    alter table TestTable 
    Add RowID bigint identity(-9223372036854775808, 1) not null; 
    
  2. обновить первую строку для каждой повторяющейся строки

    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