Actualización estado en PostgreSQL con condiciones específicas

  • Autor Autor gusta1996
  • Fecha de inicio Fecha de inicio
gusta1996

gusta1996

Delta
Verificación en dos pasos activada
hola betas necesito ayuda con postgreSQL para mis practicas porfavor.
----------------------------------------------------
Tengo las siguiente tablas:

Tabla 1: contrato
columnas tabla 1: id_contrato, estado

Tabla 2: funcionario_estructura
columnas tabla 2: id_funcionario_estructura, estado, id_contrato_fk (clave foranea)
----------------------------------------------------

lo que necesito es:
una sentencia postgreSQL que actualice un registro en la tabla "contrato" columna "estado" el valor a "anulado" pero con 2 condiciones:
  • que solo se actualize si su "id_contrato" no existe en ningun registro de "id_contrato_fk" de "funcionario_estructura"
  • y si tienen registros, todos los registros en la tabla "funcionario_estructura" columna "estado" deben ser "anulado" para poder actulizar
He intentado hacer, pero no conozco mucho sobre el tema
de antemano gracias y dejo les imagenes

1694457456311.png
 

Adjuntos

  • 1694457438584.webp
    1694457438584.webp
    52 KB · Visitas: 20
Podrías probar con este:

SQL:
UPDATE contrato
SET estado = 'anulado'
WHERE id_contrato NOT IN (
SELECT id_contrato_fk FROM funcionario_estructura WHERE estado != 'anulado')

Esta consulta actualizará la columna 'estado' a 'anulado' en la tabla 'contrato', pero sólo para aquellos registros cuyo 'id_contrato' no exista en 'funcionario_estructura' con 'estado' diferente de 'anulado'.

Recuerda siempre realizar una copia de seguridad de tus datos antes de ejecutar consultas de actualización.
 
Explícate mejor. No es los mismo que poner "anulado" a todos los registros en ambas tablas?
 
Explícate mejor. No es los mismo que poner "anulado" a todos los registros en ambas tablas?

necesito esto:
que se actualize la columna 'estado' de la tabla 'contrato' pero con estas 2 condiciones
  • Si el "id_contrato" se esta usando en la clave foranea "id_contrato_fk"... todos los registros en la tabla "funcionario_estructura" columna "estado" deben ser "anulado" para poder actulizar
  • o si no si no se esta usando el "id_contrato" en la clave foranea "id_contrato_fk"
con ayuda de chatGPT esto es lo mas cercano que pude hacer, pero sigue sin funcionar

SQL:
UPDATE contrato
SET estado = :estado
WHERE id_contrato = :id_contrato
AND (
    ( id_contrato IN (
        (SELECT id_contrato_fk FROM funcionario_estructura) = (SELECT id_contrato_fk FROM funcionario_estructura WHERE estado = 'Anulado')
        )
    )
    OR (
        id_contrato NOT IN (SELECT id_contrato_fk FROM funcionario_estructura)
    )
)
 
Seria algo asi:

Insertar CODE, HTML o PHP:
UPDATE contrato
SET estado = :estado
WHERE id_contrato = :id_contrato
AND NOT EXISTS(SELECT 1 FROM funcionario_estructura f 
WHERE f.id_contrato_fk=contrato.id_contrato AND f.estado <> 'Anulado')
 

Temas similares

Atrás
Arriba