2010-05-29 33 views
5

Muszę zaktualizować niektóre wiersze tabel, a następnie wyświetlić te wiersze. Czy istnieje sposób, aby to zrobić za pomocą jednego zapytania i uniknąć tego 2 zapytania? :W jaki sposób UPDATE i SELECT w tym samym czasie?

UPDATE table SET foo=1 WHERE boo=2 

SELECT * from table WHERE (foo=1) AND (boo=2) 
+0

Jeśli chcesz zrobić jedną rzecz, potem drugi, nie jesteś naprawdę robi je w tym samym czasie; możesz albo wyświetlać wyniki zapytania przed aktualizacją, albo po niej. –

Odpowiedz

18

W PostgreSQL, wersja 8.2 i nowsze można to zrobić za pomocą RETURNING:

UPDATE table 
SET foo=1 
WHERE boo=2 
RETURNING * 
1

Można użyć procedury składowanej lub funkcji. Będzie zawierał twoje zapytania.

2

można wykorzystywać procedurę przechowywaną w PL/PGSQL. Spójrz w [Docs] [1]

Coś jak ten

CREATE FUNCTION run(fooVal int, booVal int) 
RETURNS TABLE(fooVal int, booVal int) 
AS $$ 
BEGIN 
    UPDATE table SET foo = fooVal WHERE boo= booVal; 
    RETURN QUERY SELECT fooVal, booVal from table WHERE (foo = fooVal) AND (boo = booVal); 
END; 
$$ LANGUAGE plpgsql; 

pozwoli Ci zaoszczędzić czas udostępnia gościom za wysłanie kolejnego oświadczenia. To nie powinno być wąskie gardło wydajności. Tak krótka odpowiedź: po prostu użyj dwóch zapytań. To dobrze i tak to robisz w SQL.

[1]: http://www.postgresql.org/docs/8.4/static/plpgsql.html docs

+1

Jest to użyteczne tylko w starszych wersjach, wersjach przed wersją 8.2, zanim RETURNING był dostępny. Nie potrzebujesz dwóch zapytań na tych samych danych, jeśli możesz to zrobić za pomocą tylko jednego zapytania. –

+0

Masz rację, ale jest to niestandardowa funkcja SQL. Powinieneś być tego świadomy. Ale i tak wysyłałbym zapytania. – Janning

Powiązane problemy