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.

PostgreSQL con consulta WITH, orden de ejecución.

Estoy intentando actualizar/eliminar de una tabla y luego devolver los datos actualizados a través de una combinación interna como esta:

“`sql
WITH removed AS (
DELETE FROM cart
WHERE cart.id = 1
RETURNING *
)

SELECT cart.id, product.name, product.descr, product.price, cart.quantity
FROM cart INNER JOIN product
ON cart.product_id = product.id
WHERE cart.user_id = (SELECT user_id FROM removed);“`

Sin embargo, parece que la consulta principal de SELECT se ejecuta antes de la eliminación, por lo que los cambios no se reflejan. Según lo que he leído en la documentación de PostgreSQL:

Las subconsultas en WITH se ejecutan concurrentemente entre sí y con la consulta principal.

¿Hay un método alternativo que podría usar para devolver la instrucción SELECT después de la actualización/eliminación de la tabla?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, hay un método alternativo que podrías utilizar para devolver la declaración SELECT después de la actualización/eliminación de la tabla. Un enfoque es usar una subconsulta en la cláusula FROM para realizar la eliminación y luego hacer un join con la tabla de productos. Aquí tienes un ejemplo:

    SELECT cart.id, product.name, product.descr, product.price, cart.quantity
    FROM (
      DELETE FROM cart
      WHERE cart.id = 1
      RETURNING *
    ) AS removed
    INNER JOIN product ON removed.product_id = product.id
    WHERE cart.user_id = (SELECT user_id FROM removed);
    

    En esta consulta, la instrucción DELETE se ejecuta primero y la cláusula RETURNING devuelve las filas que fueron eliminadas. La subconsulta en la cláusula FROM utiliza estas filas eliminadas para realizar el join con la tabla de productos. Finalmente, la instrucción SELECT externa filtra los resultados para incluir solo las filas para el user_id especificado.

    Este enfoque asegura que los datos devueltos por la instrucción SELECT reflejen los cambios realizados por la instrucción DELETE.

Comments are closed.