Обновить Топ-запрос - PullRequest
       1

Обновить Топ-запрос

2 голосов
/ 15 декабря 2011

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

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

Ответы [ 4 ]

3 голосов
/ 15 декабря 2011

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

Функция TOP может быть включена в запрос для ограничения количества записей, обновляемых запросом 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 голос
/ 15 декабря 2011

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

Используйте 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 голосов
/ 11 мая 2015

У вас есть такой стол

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
    
0 голосов
/ 15 декабря 2011

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

Ссылки Код Ссылка на проект

- Решение (не проверено) Предполагая, что у нас есть таблица 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 
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...