Поменять значения между двумя строками данных - PullRequest
0 голосов
/ 26 августа 2009

Следующий сегмент кода T-SQL работает, но мне интересно, есть ли более умный и / или менее подробный способ выполнения обмена значениями поля между двумя различными строками. (Код имеет жестко запрограммированные значения pkey для простоты.)

BEGIN TRAN;

declare @swapFormSeqA int;
declare @swapFormSeqB int;

SELECT @swapFormSeqA = DisplaySeq
FROM CustomCatalogForm
WHERE CustomCatalogFormId = 1;

SELECT @swapFormSeqB = DisplaySeq
FROM CustomCatalogForm
WHERE CustomCatalogFormId = 2;

UPDATE CustomCatalogForm
SET DisplaySeq = @swapFormSeqB
WHERE CustomCatalogFormId = 1;

UPDATE CustomCatalogForm
SET DisplaySeq = @swapFormSeqA
WHERE CustomCatalogFormId = 2;

COMMIT TRAN;

РЕДАКТИРОВАТЬ: я использую Sql2k5 специально, поэтому 2k8 не вариант.

Ответы [ 4 ]

3 голосов
/ 26 августа 2009

Вы можете сделать так:

begin tran

declare @sum int

select @sum = sum(DisplaySeq)
from CustomCatalogForm
where CustomCatalogFormId in (1,2)

update CustomCatalogForm
set DisplaySeq = @sum - DisplaySeq
where CustomCatalogFormId in (1,2)

commit tran
0 голосов
/ 26 августа 2009

Попробуйте:

UPDATE ccf SET 
  DisplaySeq = Case CustomCatalogFormId 
     When 1 Then T2.DisplaySeq 
     When 2 Then T1.DisplaySeq  End
From CustomCatalogForm ccf 
    Join CustomCatalogForm T1 On T1.CustomCatalogFormId  = 1
    Join CustomCatalogForm T2 On T2.CustomCatalogFormId  = 2
Where ccf.CustomCatalogFormId  In (1,2)
0 голосов
/ 26 августа 2009

Предполагается, что ваш стол выглядит так:

--drop table CustomCatalogForm
create table CustomCatalogForm
 (
    CustomCatalogFormId  int  not null
   ,DisplaySeq char(1) not null
 )

insert CustomCatalogForm (CustomCatalogFormId, DisplaySeq)
 values (1,'A')
insert CustomCatalogForm (CustomCatalogFormId, DisplaySeq)
 values (2,'B')
insert CustomCatalogForm (CustomCatalogFormId, DisplaySeq)
 values (3,'C')
insert CustomCatalogForm (CustomCatalogFormId, DisplaySeq)
 values (4,'D')

Тогда это будет сделано для любых двух заданных значений (я проверял с 2 и 3):

select * from CustomCatalogForm
-------------------------------
DECLARE
  @Item1 int
 ,@Item2 int

SET @Item1 = 2
SET @Item2 = 3

UPDATE CustomCatalogForm
 set DisplaySeq = ccf2.DisplaySeq
 from CustomCatalogForm ccf
  inner join (select CustomCatalogFormId, DisplaySeq
               from CustomCatalogForm
               where CustomCatalogFormId = @Item1
                or CustomCatalogFormId = @Item2) ccf2
   on ccf.CustomCatalogFormId <> ccf2.CustomCatalogFormId
 where ccf.CustomCatalogFormId = @Item1
  or ccf.CustomCatalogFormId = @Item2
-------------------------------
select * from CustomCatalogForm

Хитрость заключается в том, чтобы получить обе строки только по обе стороны от соединения, и объединить в НЕ РАВНО.

0 голосов
/ 26 августа 2009

Как это:

UPDATE CustomCatalogForm
SET DisplaySeq = (SELECT DisplaySeq
    FROM CustomCatalogForm T2
    WHERE T2.CustomCatalogFormId =
        -1*(CustomCatalogForm.CustomCatalogFormId -2) +1
    )
WHERE CustomCatalogFormId IN (1,2);

(предупреждение: сначала проверьте это, поскольку я не могу проверить это отсюда).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...