Обновление только первого появления идентификатора в SQL - PullRequest
0 голосов
/ 06 октября 2009

Из-за добавленного поля в базе данных MsSql мне нужно изменить записи в таблице с NULL на что-то более полезное.

У меня есть таблица с адресами. Поскольку у клиентов есть несколько адресов, мы хотели бы пометить некоторые адреса как адреса по умолчанию, а другие как что-то вроде доставки.

Как я могу, используя запрос, изменить только первый из каждого адреса на «По умолчанию», а любой другой на «Доставка»? Каждый адрес имеет отношение внешнего ключа к таблице Customers через CustomerId.

На самом деле не имеет значения, какой из них сделан по умолчанию, если один - по умолчанию, а остальные - что-то другое. Просто чтобы иметь возможность редактировать адрес по умолчанию в пользовательском интерфейсе нашего приложения и показывать таблицу с любым другим адресом.

Ответы [ 2 ]

2 голосов
/ 06 октября 2009

Предполагая, что в таблице Address используется суррогатный первичный ключ, основанный на целых числах (например, столбец IDENTITY), и, если вам действительно все равно, какой из них помечен как DEFAULT, вы можете сделать что-то вроде следующего (который обновляет строку с самым низким целочисленным значением как DEFAULT).

DECLARE @Addresses TABLE
    (
      AddressID INT ,
      CustomerID INT ,
      AddressType VARCHAR(8)
    )

INSERT  INTO @Addresses
        ( AddressID ,
          CustomerID ,
          AddressType
        )
        SELECT  1 ,
                1 ,
                NULL --Client 1 has 3 addresss
        UNION ALL
        SELECT  2 ,
                1 ,
                NULL
        UNION ALL
        SELECT  3 ,
                1 ,
                NULL
        UNION ALL
        SELECT  4 ,
                2 ,
                NULL --Client 2 has 1 addresses
        UNION ALL
        SELECT  5 ,
                3 ,
                NULL --Client 3 has 2 addresses
        UNION ALL
        SELECT  6 ,
                3 ,
                NULL

SELECT  *
FROM    @Addresses a

--update an arbitrary address ASSUMING that you used an integer for a surrogate primary key
UPDATE  @Addresses
SET     AddressType = CASE WHEN AddressID IN ( SELECT   MIN(AddressID)
                                               FROM     @Addresses a
                                               GROUP BY a.CustomerID ) THEN 'Default'
                           ELSE 'Shipping'
                      END


SELECT  *
FROM    @Addresses a
0 голосов
/ 06 октября 2009

Зависит от того, что первое . У вас есть строки, такие как дата и т. Д., Чтобы упорядочить их. Помните, что запрос будет использовать ноль или более индексов для доступа к вашим данным. Упорядочение их также становится фактором. Если вы отбросите индексы, то порядок данных будет единственным фактором.

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