una tabla postgres obtener nombre funciones consultas consulta columnas agrupamiento agrupadas agregadas sql postgresql

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.