2009-10-06 7 views
0

MsSql 데이터베이스에 추가 된 필드로 인해 테이블의 레코드를 NULL에서보다 유용한 것으로 변경해야합니다.SQL에서 첫 번째 나타나는 ID 만 업데이트

주소가있는 테이블이 있습니다. 고객은 주소가 여러 개인 경우 특정 주소를 기본 주소로 표시하고 다른 주소는 배송과 같은 것으로 표시하려고합니다.

어떻게하면 쿼리를 사용하여 모든 주소 중 첫 번째 주소 만 "기본값"으로하고 다른 모든 주소를 "배송지"로 변경할 수 있습니까? 모든 주소에는 CustomerId를 통해 Customers 테이블과 외래 키 관계가 있습니다.

기본값이 기본값이고 나머지 값이 다른 한 기본값이 실제로 중요하지 않습니다. 단지 우리의 응용 프로그램의 UI를 통해 기본 주소를 편집하고 다른 모든 주소와 함께 테이블을 표시 할 수 있습니다.

답변

2

주소 테이블이 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

에 따라 달라집니다.. 행에 날짜 등의 개념이 있으므로 주문할 수 있습니다. 쿼리는 0 개 이상의 인덱스를 사용하여 데이터를 가져옵니다. 이것들의 순서가 또한 요인이됩니다. 인덱스를 삭제하면 데이터가 유일한 요소가됩니다.

+0

첫 번째 것은 기본 정렬에서 처음 표시됩니다. – Sorskoot

관련 문제