Maison >base de données >tutoriel mysql >Comment puis-je mettre à jour les lignes d'une table PostgreSQL à l'aide d'une sous-requête ?

Comment puis-je mettre à jour les lignes d'une table PostgreSQL à l'aide d'une sous-requête ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-05 14:38:41343parcourir

How Can I Update PostgreSQL Table Rows Using a Subquery?

Mise à jour des lignes de table dans PostgreSQL à l'aide d'une sous-requête

Dans PostgreSQL, la mise à jour des lignes existantes à l'aide des valeurs renvoyées par une instruction SELECT peut être effectuée grâce à une syntaxe pratique.

Considérez le schéma de table fourni :

CREATE TABLE public.dummy (
  address_id SERIAL,
  addr1 character(40),
  addr2 character(40),
  city character(25),
  state character(2),
  zip character(5),
  customer boolean,
  supplier boolean,
  partner boolean
);

Pour mettre à jour la table en fonction de une sous-requête, utilisez la syntaxe suivante :

UPDATE dummy
SET customer = subquery.customer,
    address = subquery.address,
    partn = subquery.partn
FROM (
  SELECT address_id, customer, address, partn
  FROM /* big hairy SQL */ ...
) AS subquery
WHERE dummy.address_id = subquery.address_id;

Cette syntaxe n'est pas du SQL standard mais est pratique pour ce type de requête. Par exemple, pour mettre à jour les colonnes client, adresse et partenaire en fonction des résultats d'une jointure complexe, vous pouvez utiliser la sous-requête suivante :

SELECT address_id,
       CASE
           WHEN cust.addr1 IS NOT NULL THEN TRUE
           ELSE FALSE
       END AS customer,
       CASE
           WHEN suppl.addr1 IS NOT NULL THEN TRUE
           ELSE FALSE
       END AS address,
       CASE
           WHEN partn.addr1 IS NOT NULL THEN TRUE
           ELSE FALSE
       END AS partn
FROM (
    SELECT *
    FROM address
) pa
LEFT OUTER JOIN cust_original AS cust
    ON (pa.addr1 = cust.addr1
        AND pa.addr2 = cust.addr2
        AND pa.city = cust.city
        AND pa.state = cust.state
        AND SUBSTRING(cust.zip, 1, 5) = pa.zip
    )
LEFT OUTER JOIN supp_original AS suppl
    ON (pa.addr1 = suppl.addr1
        AND pa.addr2 = suppl.addr2
        AND pa.city = suppl.city
        AND pa.state = suppl.state
        AND pa.zip = SUBSTRING(suppl.zip, 1, 5)
    )
LEFT OUTER JOIN partner_original AS partn
    ON (pa.addr1 = partn.addr1
        AND pa.addr2 = partn.addr2
        AND pa.city = partn.city
        AND pa.state = partn.state
        AND pa.zip = SUBSTRING(partn.zip, 1, 5)
)
WHERE pa.address_id = address_id;

En exécutant cette mise à jour, les colonnes spécifiées dans la table factice sera mis à jour avec les valeurs obtenues à partir de la sous-requête.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn