2011-07-13 16 views
16

'da birden çok sütunda bir NEREDE YAPıLMAK Bir 'times_chosen' tamsayı sütunu, bir 'times_chosen' tamsayı sütunu ve bir varchar olan bir 'option' sütunu olan bir tablo 'yanıtları' var. Şu anda 'seçenek' sütununun tek değerleri 'A', 'B', 'C' ve 'D' dir, ancak daha sonra genişletilebilir. Her birinin problem_id ve seçeneklerini bildiğimde, birçok (50-100) cevabın 'times_chosen' değerlerinden birini artırmak istiyorum.PostGresql

UPDATE answers 
SET times_chosen = times_chosen + 1 
WHERE (problem_id, option) IN ((4509, 'B'), (622, 'C'), (1066, 'D'), (4059, 'A'), (4740, 'A')...) 

bu mümkün mü:

yüzden gibi bir şey bir sorgu ihtiyacım?

+2

ile test edebilirsiniz. En azından MySQL ve MSSQL'de olduğunu düşünüyorum. Bunu denediniz mi? Bunu 'SET times_chosen = times_chosen' ile test edebilirsiniz – Dirk

+0

Oh vay, aslında yazdığım gibi iş yapıyor! Hatta endeksi kullanır! Teşekkürler Dirk - Eğer cevabınızı aşağıda bir cevap olarak kopyalıyorsanız, bunu kabul etmekten mutluluk duyarız. – PreciousBodilyFluids

+0

heh, Bunun geçerli bir sözdizimi olduğunu bilmiyordum. Bu kullanışlı = D –

cevap

8

: @Frank Çiftçi tarafından önerildiği gibi bir JOIN kullanarak çok daha iyi bir çözümdür.

Denediniz mi? SET times_chosen = times_chosen

+0

Harika çalışıyor, teşekkürler – Udi

0

Muhtemelen

SELECT * FROM foo, bar WHERE foo.bob = "NaN" AND bar.alice = "Kentucky"; 

tarzı sözdizimi arıyoruz. Esas olarak, aradığınız alanı tanımlamak için tablename.rowname öğesini kullanın.

...WHERE foo.primarykey = bar.primarykey 

veya benzeri: her şeyi düzgün sıraya için, birincil anahtarlar maç emin olun NEREDE şartlar ekleyin. İç bağlantılara bakmak için iyi yaparsın.

17

Sen türlü sanal tabloya karşı katılabilirsiniz:

SELECT * FROM answers 
JOIN (VALUES (4509, 'B'), (622, 'C'), (1066, 'D'), (4059, 'A'), (4740, 'A')) 
    AS t (p,o) 
ON p = problem_id AND o = option 

UPDATE ile benzer bir şey yapabilirsiniz. öncelikle bir diziye veri döküm eğer

+0

Güzel ve güzel ... –

3

Bunu yapabilirsin: Bu dizinleri kullanamaz olarak

UPDATE answers 
SET times_chosen = times_chosen + 1 
WHERE ARRAY[problem_id::VARCHAR,option] IN ('{4509,B}', '{622,C}', ...) 

Ancak bu inanılmaz verimsiz olacaktır. O, en azından ben diğer SQLs içinde daha önce de yaptık gerektiğini

UPDATE answers a 
SET times_chosen = times_chosen + 1 
FROM (VALUES (4509,'B'), (622,'C') ...) AS x (id,o) 
    WHERE x.id=a.problem_id AND x.o=a.option;