Tener una table con columnas listing_ids de lista, keys , ¿cómo obtener listing_ids de lista (y las claves faltantes correspondientes) donde los valores de list_of_values no existen en keys ?
list_of_values = [key2,key3]mesa
listing_id keys 424 key1 424 key2 424 key3 523 key1 2433 key2 2433 key1 53 key2 3 key3Necesito obtener el siguiente resultado:
listing_id keys_that_does_not_exist 523 key2 523 key3 2433 key3 53 key3 3 key2Lo intenté:
ids_without_keys_q = session.query(Table)\ .filter(~ exists().where(Table.key.in_(list_of_values)) estoy usando postgresql
La pregunta es cuántos valores de retorno espera. PostgreSQL no es muy bueno con los datos generados, como los que usa esta solución, por lo que si es demasiado lento, podría ser más rápido obtener una lista de todas las combinaciones y usar Python para encontrar las que no existen.
Además, asumo aquí, según su consulta, que hay una fila por par de claves/id_listado, y que no está almacenando claves como una matriz de cadenas. Si ese es el caso, hágamelo saber y revisaré la respuesta.
func.count() para filtrar todos los listados que tienen coincidencias con todas las claves: unique_incomplete_listings = session.query(Table.listing_id.label('listing_id')) .group_by(Table.listing_id) .having(func.count() < 3) from sqlalchemy.dialects.postgresql import array unique_incomplete_listings = unique_incomplete_listings.cte() all_potential_matches = session.query( unique_incomplete_listings.c.listing_id, # this creates a cartesian product of listing_ids to elements in the array func.unnest(array(['key1', 'key2', 'key3'])) ) query = all_potential_matches.except_all( session.query(Table.listing_id, Table.key) # We join here to prevent doing extra work if the listing does have all keys. # If this makes the query slower, consider making the CTE a subquery and # removing this join instead .join(unique_incomplete_listings, unique_incomplete_listings.c.listing_id == Table.listing_id) )