2013-09-30 21 views
20

Mam tabeli, który wygląda mniej więcej tak:SQL Server - Update kolumna z danymi w tej samej tabeli

SetId  ID  Premium 
2012  5   Y 
2012  6   Y 
2013  5   N 
2013  6   N 

Chcę zaktualizować 2013 rekordy z wartościami premii gdzie setid równa 2012.

Więc po zapytaniu będzie wyglądać następująco:

SetId  ID  Premium 
2012  5   Y 
2012  6   Y 
2013  5   Y 
2013  6   Y 

Każda pomoc mile widziana

+0

'2013 Ewidencja - proszę wyjaśnić tę część. Czy to jest przechowywane w twoim DB? lub jest to po prostu inne wyjaśnienie kolumny 'SetId'? – Nogard

+0

@dawsonz: Jaki jest twój oczekiwany wynik, jeśli "pierwszym rekordem składki w 2012 r. Jest" N ""? –

+0

Chcę skopiować kolumnę Premium, w której identyfikator jest taki sam, z tych rekordów z 2012 r., Do tych rekordów z 2013 r. – dawsonz

Odpowiedz

29

To nie jest jasne, który 2012 wartość chcesz użyć, aby aktualizacja, która 2013 wartość, mam przyjąć, że ID powinna być taka sama.

Pełny przykład użycia zmiennych tabeli, które można przetestować w studio zarządzania.

DECLARE @Tbl TABLE (
    SetId INT, 
    Id INT, 
    Premium VARCHAR(1) 
) 

INSERT INTO @Tbl VALUES (2012, 5, 'Y') 
INSERT INTO @Tbl VALUES (2012, 6, 'Y') 
INSERT INTO @Tbl VALUES (2013, 5, 'N') 
INSERT INTO @Tbl VALUES (2013, 6, 'N') 

--Before Update 
SELECT * FROM @Tbl 

--Something like this is what you need 
UPDATE t 
SET t.Premium = t2.Premium 
FROM @Tbl t 
INNER JOIN @Tbl t2 ON t.Id = t2.Id 
WHERE t2.SetId = 2012 AND t.SetId = 2013 

--After Update  
SELECT * FROM @Tbl 
+1

dziękuję, że ten przykład był bardzo pomocny podczas zabawy. –

10
UPDATE t 
SET t.Premium = (SELECT TOP 1 t2.Premium 
       FROM dbo.TableName t2 
       WHERE t2.SetId = 2012) 
FROM dbo.TableName t 
WHERE t.SetId = 2013 

Demonstration

7

myślę, że to jest poprawne rozwiązanie:

UPDATE t 
SET t.Premium = (SELECT TOP 1 t2.Premium 
       FROM dbo.TableName t2 
       WHERE t2.SetId = 2012 AND t2.Id = t.ID) 
FROM dbo.TableName t 
WHERE t.SetId = 2013 
+1

Bardzo dobry punkt Chris Właśnie przetestowałem i zdałem sobie z tego sprawę, dziękuję. – dawsonz

+0

Ups, usunął komentarz. To dlatego należy zauważyć subtelną różnicę między tą odpowiedzią a moją własną, ponieważ jeśli nie ma pasującego wpisu z 'SetId = 2012' i tym samym' ID', to spróbuje zaktualizować 't.Premium' do' NULL', co może się nie powieść w zależności od schematu tabeli i od tego, czy kolumna dopuszcza wartości puste. –

2

Możemy aktualizować tabelę z tabeli siebie, tak:

update TABLE_A 
    set TABLE_A.Col1=B.Col2 
    from TABLE_A B 
Powiązane problemy