【问题标题】:ORA-00927: Missing Equal Sign Oracle SQLORA-00927: 缺少等号 Oracle SQL
【发布时间】:2019-12-12 20:15:47
【问题描述】:

在尝试运行这个简单的 UPDATE 语句时,我遇到了一个令人困惑的“ORA-00927:缺少等号 Oracle SQL” 错误。

这个想法来自于我想更新 join 语句中的两个不同字段。

第一个状态更新。它已经完成了,但是当我尝试在单个查询中同时更新 STATUS 和 T_ID 时,就出现了这样的错误。

我的 SQL 代码:

UPDATE RKAP_PROYEKSI R
SET STATUS = ( 
WITH RP AS
(
  SELECT
    RKAP_PROYEKSI.ID AS ID,
    RKAP_PROYEKSI.TAHUN AS TAHUN,
    RKAP_PROYEKSI.KODE_ANGGARAN AS KODE_ANGGARAN,
    RKAP_PROYEKSI.JENIS_BIAYA AS JENIS_BIAYA,
    RKAP_PROYEKSI.SUBTOTAL AS SUBTOTAL,
    RKAP_PROYEKSI.TOTAL AS TOTAL,
    RKAP_PROYEKSI.BELONGS_TO AS BELONGS_TO,
    RKAP_PROYEKSI.NOMOR AS NOMOR,
    RKAP_PROYEKSI.STATUS AS STATUS,
    0 AS ZERO_STATUS,
    "123TRX12" AS TICK_ID
  FROM WOS.RKAP_PROYEKSI
  LEFT JOIN WOS.RKAP_MASTER_KODE ON RKAP_MASTER_KODE.ID_KODE = RKAP_PROYEKSI.KODE_ANGGARAN
  LEFT JOIN WOS.RKAP_USER ON RKAP_USER.BIRO = RKAP_MASTER_KODE.BIRO
  WHERE TAHUN = '2018' AND RKAP_MASTER_KODE.BIRO = 'BSI')
  SELECT RP.ZERO_STATUS, RP.TICK_ID
  FROM RP
  WHERE RP.ID = R.ID
)

任何深思熟虑的建议将不胜感激。

谢谢。

【问题讨论】:

标签: sql oracle join sql-update left-join


【解决方案1】:

您可以使用元组更新多个列:

UPDATE RKAP_PROYEKSI R
    SET (STATUS, T_ID) = ( 
            WITH RP AS (
                  SELECT P.ID AS ID,
                         P.TAHUN AS TAHUN,
                         P.KODE_ANGGARAN AS KODE_ANGGARAN,
                         P.JENIS_BIAYA AS JENIS_BIAYA,
                         P.SUBTOTAL AS SUBTOTAL,
                         P.TOTAL AS TOTAL,
                         P.BELONGS_TO AS BELONGS_TO,
                         P.NOMOR AS NOMOR,
                         P.STATUS AS STATUS,
                         0 AS ZERO_STATUS,
                         '123TRX12' AS TICK_ID
                   FROM WOS.RKAP_PROYEKSI P LEFT JOIN
                        WOS.RKAP_MASTER_KODE MK
                        ON MK.ID_KODE = P.KODE_ANGGARAN LEFT JOIN
                        WOS.RKAP_USER U
                        ON U.BIRO = MK.BIRO
                   WHERE P.TAHUN = '2018' AND 
                         MK.BIRO = 'BSI'
                  )
            SELECT RP.ZERO_STATUS, RP.TICK_ID
            FROM RP
            WHERE RP.ID = R.ID
           );

令人着迷。我没有意识到在这种情况下不允许使用 CTE。您需要将其表述为子查询(可以有 CTE):

UPDATE RKAP_PROYEKSI R
    SET (STATUS, T_ID) = ( 
      SELECT RP.ZERO_STATUS, RP.TICK_ID
      FROM (WITH RP AS (
                  SELECT P.ID AS ID,
                         P.TAHUN AS TAHUN,
                         P.KODE_ANGGARAN AS KODE_ANGGARAN,
                         P.JENIS_BIAYA AS JENIS_BIAYA,
                         P.SUBTOTAL AS SUBTOTAL,
                         P.TOTAL AS TOTAL,
                         P.BELONGS_TO AS BELONGS_TO,
                         P.NOMOR AS NOMOR,
                         P.STATUS AS STATUS,
                         0 AS ZERO_STATUS,
                         '123TRX12' AS TICK_ID
                   FROM WOS.RKAP_PROYEKSI P LEFT JOIN
                        WOS.RKAP_MASTER_KODE MK
                        ON MK.ID_KODE = P.KODE_ANGGARAN LEFT JOIN
                        WOS.RKAP_USER U
                        ON U.BIRO = MK.BIRO
                   WHERE P.TAHUN = '2018' AND 
                         MK.BIRO = 'BSI'
                  )
             SELECT RP.*                
             FROM RP
            ) RP
      WHERE RP.ID = R.ID
     );

当然,CTE 只是杂乱无章。您可以简化查询,但我假设您需要 CTE。

【讨论】:

  • 它说,ORA-01767: UPDATE ... SET 表达式必须是子查询先生。 @戈登林诺夫
  • @aldi 。 . .我学到了一些东西。您可以在 FROM 子句的子查询中使用 CTE,但不能在此上下文中使用。
  • 天啊,它就像一个魅力!我应该了解更多关于 CTE 的信息,非常感谢 @Gordon Linoff 先生
【解决方案2】:

您正在选择多列但更新单列

UPDATE RKAP_PROYEKSI R
SET STATUS = ( 
WITH RP AS
(
  SELECT
    RKAP_PROYEKSI.ID AS ID,
    RKAP_PROYEKSI.TAHUN AS TAHUN,
    RKAP_PROYEKSI.KODE_ANGGARAN AS KODE_ANGGARAN,
    RKAP_PROYEKSI.JENIS_BIAYA AS JENIS_BIAYA,
    RKAP_PROYEKSI.SUBTOTAL AS SUBTOTAL,
    RKAP_PROYEKSI.TOTAL AS TOTAL,
    RKAP_PROYEKSI.BELONGS_TO AS BELONGS_TO,
    RKAP_PROYEKSI.NOMOR AS NOMOR,
    RKAP_PROYEKSI.STATUS AS STATUS,
    0 AS ZERO_STATUS,
    "123TRX12" AS TICK_ID
  FROM WOS.RKAP_PROYEKSI
  LEFT JOIN WOS.RKAP_MASTER_KODE ON RKAP_MASTER_KODE.ID_KODE = RKAP_PROYEKSI.KODE_ANGGARAN
  LEFT JOIN WOS.RKAP_USER ON RKAP_USER.BIRO = RKAP_MASTER_KODE.BIRO
  WHERE TAHUN = '2018' AND RKAP_MASTER_KODE.BIRO = 'BSI')
  SELECT min(RP.ZERO_STATUS)
  FROM RP
  WHERE RP.ID = R.ID
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    相关资源
    最近更新 更多