Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

397
Vistas
sqlalchemy: obtener identificadores donde los valores no existen

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 key3

Necesito obtener el siguiente resultado:

 listing_id keys_that_does_not_exist 523 key2 523 key3 2433 key3 53 key3 3 key2

Lo intenté:

 ids_without_keys_q = session.query(Table)\ .filter(~ exists().where(Table.key.in_(list_of_values))

estoy usando postgresql

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

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.


  1. Primero, asumo que no desea identificaciones donde no haya coincidencias, por lo que en lugar de generar una lista, puede construirla así. Uso 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)
  1. Segundo, convierta esto en un CTE , luego obtenga todas las combinaciones posibles de (listado, clave) de la consulta:
 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'])) )
  1. Elimine cualquier coincidencia que encuentre en la base de datos usando EXCEPT
 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) )
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda