Выполнение WHERE IN для нескольких столбцов в Postgresql - PullRequest
25 голосов
/ 13 июля 2011

У меня есть таблица 'answers' с индексированным целочисленным столбцом 'problem_id', целочисленным столбцом 'times_chosen' и столбцом 'option', это varchar. В настоящее время единственными значениями для столбца 'option' являются 'A', 'B', 'C' и 'D', хотя позже они могут расшириться. Я хочу увеличить на единицу 'times_chosen' значения многих (50-100) ответов, когда я знаю problem_id и опцию каждого из них.

Так что мне нужен запрос, похожий на:

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

Возможно ли это?

Ответы [ 4 ]

19 голосов
/ 13 июля 2011

Вы можете присоединиться к виртуальной таблице сортов:

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.

9 голосов
/ 13 июля 2011

Должен, по крайней мере, я делал это раньше в других SQL.

Вы пробовали это? Вы можете проверить это с SET times_chosen = times_chosen

3 голосов
/ 13 июля 2011

Вы можете сделать это, если сначала приведете данные к массиву:

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

Однако это будет невероятно неэффективно, поскольку не может использовать индексы.Использование JOIN в соответствии с предложением @Frank Farmer является гораздо лучшим решением:

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;
0 голосов
/ 13 июля 2011

Возможно, вы ищете синтаксис стиля

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

.По сути, вы используете tablename.rowname, чтобы указать, какое именно поле вы ищете.Чтобы все выстроить правильно, вы добавляете предложения WHERE, обеспечивающие совпадение первичных ключей:

...WHERE foo.primarykey = bar.primarykey

или аналогичные.Вы бы хорошо, чтобы посмотреть внутренние соединения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...