Maison >base de données >tutoriel mysql >Comment mettre à jour les lignes PostgreSQL avec les valeurs d'une sous-requête ?

Comment mettre à jour les lignes PostgreSQL avec les valeurs d'une sous-requête ?

DDD
DDDoriginal
2025-01-04 21:10:40254parcourir

How to Update PostgreSQL Rows with Values from a Subquery?

Mise à jour des lignes de table PostgreSQL à l'aide de sous-requêtes

Pour mettre à jour les lignes existantes dans une table PostgreSQL à l'aide des valeurs renvoyées par une sous-requête, vous pouvez utiliser ce qui suit syntaxe :

UPDATE table_name
SET column_name = subquery.column_name
FROM (SELECT ...) AS subquery
WHERE table_name.id = subquery.id;

Considérez l'exemple de table factice que vous 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
)
WITH (
  OIDS=FALSE
);

Pour mettre à jour les colonnes client, fournisseur et partenaire en fonction des valeurs renvoyées par une instruction select, vous pouvez utiliser la syntaxe suivante :

UPDATE dummy
SET customer = subquery.customer,
    supplier = subquery.supplier,
    partner = subquery.partner
FROM (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 supplier,
            CASE WHEN partn.addr1 IS NOT NULL THEN TRUE ELSE FALSE END AS partner
      FROM address AS 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 CAST(cust.zip AS VARCHAR(5)) = CAST(pa.zip AS VARCHAR(5)))
      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 CAST(pa.zip AS VARCHAR(5)) = CAST(CAST(suppl.zip AS VARCHAR(25)) AS VARCHAR(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 CAST(pa.zip AS VARCHAR(5)) = CAST(CAST(partn.zip AS VARCHAR(25)) AS VARCHAR(5)))) AS subquery
WHERE dummy.address_id = subquery.address_id;

Cette requête effectue la opérations suivantes :

  • Sélectionne les valeurs client, fournisseur et partenaire pour chaque ligne de la table factice à partir d'une sous-requête qui joint la table factice avec le tables cust_original, supp_original et Partner_original.
  • Définit les colonnes client, fournisseur et partenaire de la table factice avec les valeurs renvoyées par la sous-requête.
  • Mise à jour uniquement les lignes de la table factice qui avoir un adresse_id correspondant dans 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