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
Verificado por Whatsapp
¡Ha verificado su Paypal!
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: 16
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.
 
no funciona
 
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')
 
Atrás
Arriba