2013-06-05 21 views
11

Mam pytanie dotyczące poniższej składni. Czy istnieje bardziej przejrzysty sposób przekształcenia tego w jedno zdanie, a nie w dwa. Próbowałem już kilku iteracji, ale wydaje mi się, że to jedyny sposób, w jaki mogę skutecznie wykonać te dwa stwierdzenia.Aktualizacja instrukcja aktualizacji wielu wierszy

UPDATE employee 
SET hire_date = '1979-03-15' 
WHERE emp_id = 'PMA42628M' 

UPDATE employee 
SET hire_date = '1988-12-22' 
where emp_id = 'PSA89086M'; 

Próbowałem tego również i próbowałem również używać instrukcji ORAZ. Żaden nie zadziałał. Zasadniczo szukam mniej początkującego sposobu niż powyższa metoda, jeśli taka istnieje. Długo szukałem i nie znalazłem.

UPDATE employee 
SET hire_date = ('1979-03-15', '1988-12-22') 
WHERE emp_id = ('PMA42628M', 'PSA89086M'); 

Wyostrz wszelkie rady na ten temat, a przy okazji, używam serwera sql. Dzięki

Odpowiedz

18

próbować ten jeden, to łączenie wielu wybiera i zwraca je tak, jakby pochodzą z DB:

UPDATE e 
SET hire_date = t.hire_date 
FROM dbo.employee e 
JOIN (
    SELECT emp_id = 'PMA42628M', hire_date = '1979-03-15' 
    UNION ALL 
    SELECT emp_id = 'PSA89086M', hire_date = '1988-12-22' 
) t ON t.emp_id = e.emp_id 

Jeśli używasz SQL Server 2008 lub nowszej wersji, można również użyć innego Składnia tabeli pochodzącej:

UPDATE e 
SET hire_date = t.hire_date 
FROM dbo.employee e 
JOIN (
    VALUES 
     ('PMA42628M', '1979-03-15'), 
     ('PSA89086M', '1988-12-22') 
) t (emp_id, hire_date) ON t.emp_id = e.emp_id 
+0

nie jest słowem kluczowym "AS" brakującym dwa razy? – Zim84

+0

Nie używam słowa kluczowego "AS" w tej sytuacji, ponieważ jest niepotrzebne. – Devart

+0

@ Zim84 i dzięki za recenzję. – Devart

7

szukam mniej początkującego sposób

Wykonywanie dwóch oddzielnych instrukcji aktualizacyjnych to (według mnie) "mniej nowatorski" sposób, w jaki można komplikować rzeczy i robić coś takiego.

update employee 
set hire_date = case emp_id 
        when 'PMA42628M' then '1979-03-15' 
        when 'PSA89086M' then '1988-12-22' 
       end 
where emp_id in ('PMA42628M', 'PSA89086M') 

ale co by to przyniosło? Cała aktualizacja działałaby w jednej transakcji niejawnej, więc jeśli chcesz, aby dwie aktualizacje były w transakcji, po prostu użyj begin transaction .... commit.

+0

Skończyło się na tym pytaniu, ponieważ szukałem sposobu na optymalizację powolnej (interaktywnej) aplikacji, która zawiera około 100K instrukcji aktualizacji w ciągu minuty . Przejście do sugerowanego wariantu kombinowanego dało nam przyspieszenie o około 700%, więc teraz wykonujemy tę samą pracę w mniej niż dziesięć sekund. Umieszczenie wszystkiego w transkacji nie pomaga, ponieważ jest to czas wysyłki i obiegu dla wszystkich instrukcji SQL, które zajmują większość czasu. – flodin

3

Aby dodać do innych już wymienionych sposobów: możesz utworzyć tabelę tymczasową lub zmienną tabeli zawierającą aktualizacje, które chcesz wykonać, a następnie uruchomić instrukcję UPDATE, łącząc tabelę z tabelą, którą chcesz zaktualizować.

Należy pamiętać, że w przypadku dwóch aktualizacji są wyświetlane dwie instrukcje: INSERT w tabeli aktualizacji i sama instrukcja UPDATE. Liczba instrukcji pozostaje jednak druga dla tylu aktualizacji, ile potrzebujesz.

CREATE TABLE #employee (emp_id VARCHAR(9) NOT NULL PRIMARY KEY,hire_date DATE NOT NULL); 
INSERT INTO #employee (emp_id,hire_date) 
VALUES ('PMA42628M','2013-06-05'),('PSA89086M','2013-06-05'); 

CREATE TABLE #target_updates(emp_id VARCHAR(9) NOT NULL,hire_date DATE NOT NULL); 
INSERT INTO #target_updates (emp_id,hire_date) 
VALUES ('PMA42628M','1979-03-15'),('PSA89086M','1988-12-22'); 

UPDATE 
    #employee 
SET 
    hire_date=tu.hire_date 
FROM 
    #employee AS e 
    INNER JOIN #target_updates AS tu ON 
     tu.emp_id=e.emp_id; 

SELECT 
    * 
FROM 
    #employee 
ORDER BY 
    emp_id; 

DROP TABLE #target_updates; 
DROP TABLE #employee; 
+1

Ta shd jest akceptowaną odpowiedzią, ponieważ ma zastosowanie do aktualizacji liczby n wierszy z już istniejącej tabeli –

Powiązane problemy