tabla - Haciendo un WHERE IN en varias columnas en Postgresql
having sql (4)
Debería, al menos lo he hecho antes en otros SQLs.
¿Lo has probado? Puedes probarlo con SET times_chosen = times_chosen
Tengo una tabla de "respuestas" con una columna entera indexada ''problem_id'', una columna entera ''times_chosen'' y una columna ''option'' que es una varchar. Actualmente, los únicos valores para la columna ''opción'' son ''A'', ''B'', ''C'' y ''D'', aunque estos pueden expandirse más adelante. Quiero incrementar en uno los valores de ''times_chosen'' de muchas respuestas (50-100), cuando conozco el problem_id y la opción de cada una de ellas.
Así que necesito una consulta que es algo como:
UPDATE answers
SET times_chosen = times_chosen + 1
WHERE (problem_id, option) IN ((4509, ''B''), (622, ''C''), (1066, ''D''), (4059, ''A''), (4740, ''A'')...)
es posible?
Probablemente estés buscando el
SELECT * FROM foo, bar WHERE foo.bob = "NaN" AND bar.alice = "Kentucky";
sintaxis de estilo Esencialmente, usa tablename.rowname para especificar qué campo individual está buscando. Para alinear todo correctamente, agregue cláusulas WHERE que aseguren que las claves principales coincidan:
...WHERE foo.primarykey = bar.primarykey
o similar. Harías bien en buscar uniones internas.
Puede hacer esto si primero convierte los datos a una matriz:
UPDATE answers
SET times_chosen = times_chosen + 1
WHERE ARRAY[problem_id::VARCHAR,option] IN (''{4509,B}'', ''{622,C}'', ... )
Sin embargo, esto será increíblemente ineficiente, ya que no puede usar índices. Usar una ÚNICA como lo sugiere @Frank Farmer es una solución mucho mejor:
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;
Puedes unirte contra una tabla virtual de clases:
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
Puedes hacer algo similar con ACTUALIZAR.