sql >> Database teknologi >  >> RDS >> PostgreSQL

Laver en stor opdatering ved hjælp af flere tabeller i PostgreSQL

Denne forespørgsel skulle give de samme resultater, men undgår CASE

-- FORKLARING ANALYSEOPDATERING tabel_a aSET rebuilding_costs =drie.rebuilding_costsFROM ( SELECT COALESCE(b.address, c.address, d.address) AS address , COALESCE(b.rebuilding_costs, c.rebuilding_rebuilding, dcost.rebuilding_s)_ AS rebuilding_costs FROM table_b b FULL YDRE JOIN table_c c ON c.address =b.address AND c.rebuilding_costs MELLEM 200001 OG 400000 FULL YDRE JOIN table_D d ON d.address =b.address BETWEEN 200001 AND 400000 FULL OUTER JOIN table_D d ON d.address =b.rebuilding_0AND0.00.00. rebuilding_costs MELLEM 100001 OG 200000 ) drieWHERE a.address =drie.addressAND a.rebuilding_costs <> drie.rebuilding_costs -- Undgå ubrugelige opdateringer;

OPDATERING:En lignende tilgang, baseret på et kædet sæt af CTE'er:

----------------------------------- FORKLAR ANALYSER MED cte_b AS ( SELECT b.address, b.rebuilding_costs FRA table_b b WHERE b.rebuilding_costs MELLEM 100001 OG 200000 ), cte_c AS ( SELECT c.address , c.rebuilding_costs FROM table_c c WHERE c.rebuilding_costs 0.EX00ANDS 4.EX0ANDS 4.EX00ANDS =c.address) ), cte_d AS ( SELECT d.address , d.rebuilding_costs FROM table_d d WHERE d.rebuilding_costs MELLEM 400001 OG 600000 OG IKKE FINDER (SELECT * FROM cte_b WHERE cte_b. VÆLG * FRA cte_c WHERE cte_c.address =d.address) ), cte_bcd AS ( SELECT cte_b.address, cte_b.rebuilding_costs FRA cte_b UNION ALLE VÆLG cte_c.address, cte_c.rebuilding_costs FROM_ cte_b.ddress.crebuilding_costs FROM_ cte_c.dc. FRA cte_d )UPDAT E table_a aSET rebuilding_costs =cte_bcd.rebuilding_costsFROM cte_bcdWHERE a.address =cte_bcd.address-- undgå ubrugelige opdateringer på denne måde:OG a.rebuilding_costs <> cte_bcd.rebuilding_costs-- ,FINCOG_DIN_CST_EN .rebuilding_costs;

OPDATERING 2:CTE'er kan være langsomme, fordi de fungerer som optimeringsbarrierer. En hurtig og beskidt måde er at omskrive dem som (midlertidige) VIEWS, og henvise til disse i stedet for. Dette giver optimeringsværktøjet mulighed for at blande de forskellige dele af forespørgslen ind og ud af underforespørgsler og endda kombinere og genbruge disse.

CREATE TEMP VIEW cte_b AS ( SELECT b.address, b.rebuilding_costs FROM table_b b HVOR b.rebuilding_costs MELLEM 100001 OG 200000 ); CREATE TEMP VIEW cte_c AS ( SELECT c.crebuilding_costs; WHERE c.rebuilding_costs MELLEM 200001 OG 400000 OG IKKE FINDER (SELECT * FROM cte_b WHERE cte_b.address =c.address) );CREATE TEMP VIEW cte_d AS (SELECT BE d.address , d.rebuilding_costbuilding_costbuild00FILDE_COSTBULD00. OG 600000 OG FINDER IKKE (SELECT * FROM cte_b WHERE cte_b.address =d.address) AND NOT EXISTS (SELECT * FROM cte_c WHERE cte_c.address =d.address) );CREATE TEMP VIEW cte_bcd AS ( SELECT cte_baddress, cte_b .rebuilding_costs FRA cte_b UNION ALLE SELECT cte_c.address, cte_c.rebuilding_costs FROM cte_c UNION ALL SELECT cte_d.address, cte_d.rebuilding_costs FROM cte_d );EXPLAIN -- ANALYSEOPDATERING tabel_a aSET rebuilding_costs =cte_bcd.rebuilding_costsFROM cte_bcdWHERE a.address =cte_bcd.address 



  1. Databasen fjernes ikke, når Android-applikationen afinstalleres

  2. SQL Server betinget CHECK-begrænsning

  3. Tæller antallet af udførte forespørgsler

  4. SQL-serverlogforsendelse og installation og konfiguration -3