Как использовать обновление и с помощью PLSQL

StackOverflow https://stackoverflow.com/questions/4218762

  •  26-09-2019
  •  | 
  •  

Вопрос

У кого-нибудь есть образец того, как использовать и обновлять в запросе в 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.

Это было полезно?

Решение

Это как использовать в обновлении в 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
);

Другие советы

Глядя на синтаксические диаграммы для Обновить а также Выбрать, Я не уверен, что факторинг подзапроса может использоваться с обновлением. Вы можете либо заменить эти запросы в полной мере обратно в подзаконную часть вашего оператора обновления, или вы можете создать для них представления. Я бы пошел с видами.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top