2010-12-05 15 views
19

Django aracılığıyla eriştiğim büyük bir PostgreSQL tablom var. Django'nun ORM'si pencere işlevlerini desteklemediğinden, bir pencere işlevinin sonuçlarını tabloya düzenli bir sütun olarak pişirmem gerekiyor. Böyle bir şey yapmak istiyorum:Bir güncelleştirme deyiminde pencere işlevlerini kullanma

UPDATE table_name 
SET  col1 = ROW_NUMBER() OVER (PARTITION BY col2 ORDER BY col3); 

Ama ERROR: cannot use window function in UPDATE

kimse alternatif bir yaklaşım önerebilir olsun? Ihtiyacım olan .filter() gibi daha fazla ORM özelliklerini desteklemeyen bir RawQuerySet döndürdüğünden, Django'nun .raw() yöntemiyle pencere işlevi sözdizimini geçmek uygun değildir.

Teşekkürler.

cevap

34

Bu hata django değil postgres'tir. alternatif

WITH v_table_name AS 
(
    SELECT row_number() over (partition by col2 order by col3) AS rn, primary_key 
    FROM table_name 
) 
UPDATE table_name set table_name.col1 = v_table_name.rn 
FROM v_table_name 
WHERE table_name.primary_key = v_table_name.primary_key; 

Veya: Sen olarak bu yeniden yazabilirsiniz

UPDATE table_name set table_name.col1 = v_table_name.rn 
FROM 
(
    SELECT row_number() over (partition by col2 order by col3) AS rn, primary_key 
    FROM table_name 
) AS v_table_name 
WHERE table_name.primary_key = v_table_name.primary_key; 

Bu çalışır. Sadece postgres-9.6'da test ettim. İşte UPDATE için sözdizimi (isteğe bağlı liste bakın).

Bu yardımcı olur umarım.

+0

Kendine katılmaya ihtiyacınız olduğunu düşünmüyorum? SQL Server'da neyin çalıştığı üzerine kurduğum gibi yanlış olabilirim! –

+0

@Martin: İki tablo seçiyorsunuz, bir tanesi UPDATE 'tablename' üzerinden, diğeri ise 'FROM tablename' ifadesinde. Eğer açıkça katılmazsanız, bir Kartezyen ürün üretecek. – Max

+0

er, hayır ben değilim! –

İlgili konular