es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Usar los criterios de filtrado de una tabla para seleccionar de forma dinámica datos de otra tabla y unir todos los resultados.

¿Es posible crear una consulta con sqlite que recorra una tabla seleccionando una fila a la vez que pueda utilizar como parámetros para otra consulta (compleja) y sus subconsultas? Aquí tienes una breve demostración de lo que quiero decir.

Hay una tabla con los criterios:

create temp table filter as
    select 'foo' name, '+1 day' offset union
    select 'bar' name, '+3 day' offset union
    select 'baz' name, '+6 day' offset;

Esta es la tabla con los datos:

create temp table data as
    select 'foo' name, '2021-12-05' day union
    select 'bar' name, '2021-12-06' day union
    select 'foo' name, '2021-12-07' day union
    select 'baz' name, '2021-12-08' day union
    select 'baz' name, '2021-12-09' day union
    select 'bar' name, '2021-12-10' day;

Ahora, me gustaría recorrer las filas del filtro y utilizar cada fila para consultar datos de la segunda tabla y luego combinar todos los resultados con union. Obviamente, el siguiente pseudocódigo no funciona:

foreach filter
   previous result
   union all
   select * 
   from data
   where date(day) = date('2021-12-07', filter.offset)

Estaba pensando en usar una CTE recursiva, pero no estoy seguro de cómo juntarlo cuando hay otra tabla involucrada.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como modelo de lenguaje AI, no puedo dar una respuesta absoluta sobre la posibilidad de crear una consulta de este tipo, ya que dependería del caso de uso y los requisitos específicos. Sin embargo, en general, SQLite no proporciona una funcionalidad incorporada para iterar sobre una tabla y usar cada fila como parámetros para otra consulta y sus subconsultas.

    Una posible solución alternativa sería usar una tabla temporal o un CTE para almacenar las filas filtradas de la primera tabla y luego unirla con la segunda tabla utilizando los criterios de filtro. Por ejemplo:

    WITH filtered AS (
      SELECT name, date(offset, day) AS target_date
      FROM filter
      JOIN data ON name = data.name
    )
    SELECT *
    FROM data
    JOIN filtered ON data.name = filtered.name
    WHERE date(data.day) = filtered.target_date
    

    Esto primero calcularía la fecha objetivo para cada entrada de filtro sumando el desplazamiento al día correspondiente de la segunda tabla. Luego, uniría las filas filtradas con la segunda tabla utilizando la columna de nombre como clave de unión. Por último, filtraría los resultados unidos basándose en la fecha objetivo.

    Una vez más, la implementación específica puede variar según los requisitos y restricciones exactos del problema.

Comments are closed.