sql >> Databasteknik >  >> RDS >> Oracle

Konvertera Välj Oracle-fråga till uppdatering för ett specifikt scenario

Ett bra sätt att uppdatera en tabell från en fråga är att använda en MERGE-sats. Här är ett exempel som kopierar alla_objekt och lägger till en kolumn med antalet objekt som matchar radens ägare och typ.

CREATE TABLE all_objects_2 AS
SELECT *
  FROM all_objects;

ALTER TABLE all_objects_2 add owner_and_type_ct NUMBER;

MERGE INTO all_objects_2 ao2
USING (SELECT ao.owner,
              ao.object_type,
              COUNT(*) AS ct
         FROM all_objects ao
        GROUP BY ao.owner,
                 ao.object_type) x
ON (ao2.owner = x.owner AND ao2.object_type = x.object_type)
WHEN MATCHED THEN
  UPDATE
     SET ao2.owner_and_type_ct = x.ct;

SELECT ao2.owner,
       ao2.object_name,
       ao2.object_type,
       ao2.owner_and_type_ct
  FROM all_objects_2 ao2
 WHERE rownum < 10;
/*
SYS C_TS# CLUSTER 10
SYS I_TS# INDEX 1459
SYS C_FILE#_BLOCK#  CLUSTER 10
SYS I_FILE#_BLOCK#  INDEX 1459
SYS FET$  TABLE 1592
SYS UET$  TABLE 1592
SYS SEG$  TABLE 1592
SYS UNDO$ TABLE 1592
SYS TS$ TABLE 1592
*/

Du SLUTAR TILL [destinationstabell] MED [din fråga] PÅ [kriterier för att ansluta fråga till destination] och NÄR du MATCHAR en rad UPPDATERAR du raden med värdena från frågan. Du kan också INSERT och DELETE med en MERGE, men jag tänker inte duplicera alla dokumentation .




  1. ScrollPane läggs till i rutnätslayout

  2. Symfony2-doktrinen ansluter till databasen via SSL

  3. konstig teckenkodning av lagrad data, gammalt skript visar dem bra, nytt gör det inte

  4. java.lang.UnsupportedOperationException:org.hibernate.dialect.Oracle10gDialect stöder inte resultatuppsättningar via lagrade procedurer