WITH
, SELECT
sorgusunda kullanmak üzere "geçici tabloları" tanımlamanıza izin verir. Örneğin, son zamanlarda iki takım arasındaki değişiklikleri hesaplamak için, böyle bir sorgu yazdım:
-- Let o be the set of old things, and n be the set of new things.
WITH o AS (SELECT * FROM things(OLD)),
n AS (SELECT * FROM things(NEW))
-- Select both the set of things whose value changed,
-- and the set of things in the old set but not in the new set.
SELECT o.key, n.value
FROM o
LEFT JOIN n ON o.key = n.key
WHERE o.value IS DISTINCT FROM n.value
UNION ALL
-- Select the set of things in the new set but not in the old set.
SELECT n.key, n.value
FROM o
RIGHT JOIN n ON o.key = n.key
WHERE o.key IS NULL;
üstündeki o
ve n
"tabloları" tanımlayarak, ben ifadeler things(OLD)
ve things(NEW)
tekrarlamaktan kaçınmak başardı.
Elbette, FULL JOIN
kullanarak UNION ALL
'u ortadan kaldırabiliriz, ancak bunu özel durumumda yapamadım.
durum 'reset' 'yeni' ya da global.prospect en eski satırını bulun:
Doğru Sorgunuzla anlamak, bu bunu yapar. onun durumu
Dönüş (status
bizim çimdik dahil) satır için yıldız işareti ekleyerek
Mark onu.
WITH
durumunuzdaki herhangi bir şeyi basitleştireceğini sanmıyorum. Yine de bir FROM
maddesini kullanmak biraz daha şık olabilir:
update global.prospect psp
set status = status || '*'
from (select psp_id
from global.prospect
where status = 'new' or status = 'reset'
order by request_ts
limit 1
) p2
where psp.psp_id = p2.psp_id
returning psp.*;
Untested. Eğer işe yararsa beni bilgilendir.
Size dışında zaten tam olarak ne hemen hemen açıklanmıştır: Bu kolayca birden çok satır güncellemek için uzatılabilir
. Bir alt sorgu ifadesi kullanan sürümünüzde, alt sorgu birden çok satır oluşturmak için değiştirildiyse sorgu başarısız olur.
Alt sorguya global.prospect
takmadım, bu yüzden okunması biraz daha kolay. Bu bir FROM
yan tümcesi kullandığından, güncelleştirilmekte olan tabloyu yanlışlıkla başvuruyorsanız bir hata alırsınız.
Sizin sürümünüzde, her bir öğe için alt sorgu ifadesi ile karşılaşılır. PostgreSQL bunu optimize etmeli ve sadece ifadeyi bir kez değerlendirse de, psp
'da bir sütuna yanlışlıkla başvurursanız veya bir uçucu ifade eklediğinizde bu optimizasyon ortadan kalkar.dahil tablolara eşzamanlı yazma erişimi olabiliyorsa
Dokümantasyona göre, '' [RECURSIVE] '' INSERT' ve 'UPDATE' ifadelerinin üzerinde PostgreSQL 9.1’de eklenmiştir. –
@JoeyAdams - dml ile kullanma - soğanın başka bir katmanını anlamak için –