代码之家  ›  专栏  ›  技术社区  ›  Raj More

如何在PLSQL中使用UPDATE和WITH

  •  1
  • Raj More  · 技术社区  · 15 年前

    有没有人有关于如何在PLSQL中使用和更新查询的示例?

    我疯狂地搜索,但没有成功。

    这就是我要做的

    WITH
    OldRecords AS
    (
      SELECT 'New Records' as RecordLabel, rowid, OrDev.* 
      FROM CDR.MSRS_OR_ORDEV OrDev
      WHERE 1=1
        AND OrDev.ASOFENDDATETIME IS NULL
        AND OrDev.REPORTSTARTDATE = to_date ('7/1/2010', 'mm/dd/yyyy')
        AND OrDev.REPORTENDDATE = to_date ('7/31/2010', 'mm/dd/yyyy')
        AND OrDev.downloadrequestid <> 3
    ), 
    NewRecords AS
    (
      SELECT 'Old Records' as RecordLabelrowid, OrDev.* 
      FROM CDR.MSRS_OR_ORDEV OrDev
      WHERE 1=1
        AND OrDev.ASOFENDDATETIME IS NULL
        AND OrDev.REPORTSTARTDATE = to_date ('7/1/2010', 'mm/dd/yyyy')
        AND OrDev.REPORTENDDATE = to_date ('7/31/2010', 'mm/dd/yyyy')
        AND OrDev.downloadrequestid = 3
    )
    UPDATE CDR.MSRS_OR_ORDEV SET ASOFENDDATETIME = GETDATE()
    WHERE RowID IN
    (
      SELECT OldRecords.RowId
      FROM OldRecords
        INNER JOIN NewRecords
          ON  OldRecords.Customer_Id = NewRecords.Customer_Id
          AND OldRecords.BusinesKey1 = NewRecords.BusinesKey1
          AND OldRecords.BusinesKey2 = NewRecords.BusinesKey2
    )
    

    基本上这是一个II型维度更新。

    2 回复  |  直到 15 年前
        1
  •  3
  •   Raj More    15 年前

    这是如何在PLSQL的更新中使用的。请注意,这只适用于单列更新。

    UPDATE CDR.MSRS_OR_ORDEV 
    SET ASOFENDDATETIME = sysdate
    WHERE RowID IN
    (
      WITH
      OldRecords AS
      (
        SELECT rowid, OldRecords.* 
        FROM CDR.MSRS_OR_ORDEV OldRecords
        WHERE 1=1
          AND OldRecords.ASOFENDDATETIME IS NULL
          AND OldRecords.REPORTSTARTDATE = to_date ('7/1/2010', 'mm/dd/yyyy')
          AND OldRecords.REPORTENDDATE = to_date ('7/31/2010', 'mm/dd/yyyy')
          AND OldRecords.downloadrequestid <> 3
      ), 
      NewRecords AS
      (
        SELECT rowid, NewRecords.* 
        FROM CDR.MSRS_OR_ORDEV NewRecords
        WHERE 1=1
          AND NewRecords.ASOFENDDATETIME IS NULL
          AND NewRecords.REPORTSTARTDATE = to_date ('7/1/2010', 'mm/dd/yyyy')
          AND NewRecords.REPORTENDDATE = to_date ('7/31/2010', 'mm/dd/yyyy')
          AND NewRecords.downloadrequestid = 3
      )
      SELECT OldRecords.RowId
      FROM OldRecords
        INNER JOIN NewRecords
          ON  OldRecords.BusinesKey1 = NewRecords.BusinesKey1
          AND OldRecords.BusinesKey2 = NewRecords.BusinesKey2
    );
    
        2
  •  0
  •   FrustratedWithFormsDesigner    15 年前

    查看的语法图 update select ,我不确定子查询因子是否可以用于update。您可以将这些查询完全替换回UPDATE语句的子查询部分,也可以为它们创建视图。我同意你的观点。