【问题标题】:PL/SQL update using CASE in join condition? [closed]在连接条件下使用 CASE 更新 PL/SQL? [关闭]
【发布时间】:2019-05-18 04:56:34
【问题描述】:

我有旧的 Oracle 10g 数据库,我需要编写更新。我编写了更好的 TSQL,但我的 PL/SQL 很糟糕,我需要一些帮助。

我有 3 个表:源表、链接表和目标表。因为表中的数据很糟糕,所以我需要使用 REPLACE/TRIM 函数和 CASE 才能使联接起作用。

但是,这会导致问题,我无法弄清楚在使用 CASE 后如何编写更新。我尝试使用 MERGE 和 UPDATE 但没有运气。
我写了这个 SELECT 语句,我应该可以正常工作:

SELECT 
C.NAME, 
-- C.FLAG -- How I can update flag here?
FROM TEST.C_TABLE C
INNER JOIN
(
    SELECT 
        CASE 
            WHEN LENGTH(TRIM(REPLACE(REPLACE(REPLACE(ID, '-', ''), '&&', ''), '"', ''))) = 15
            THEN TRIM(REPLACE(REPLACE(REPLACE(ID, '-', ''), '&&', ''), '"', '')) -- TRUE, because some rows causes problems...
            ELSE TRIM(REPLACE(REPLACE(REPLACE(SUBSTR(ID ,-9, 9), '-', ''), '&&', ''), '"', '')) -- FALSE 
        END ID,
                                                          NAME
    FROM TEST.B_TABLE
) B
ON B.NAME = C.NAME
INNER JOIN A_TABLE A ON REPLACE(A.ID, '&&', '') = B.ID

如何将这个 SELECT 语句“转换”为 UPDATE 或 MERGE?

谢谢!

【问题讨论】:

  • 你为什么不用英语表达更新需要完成什么。根据您的选择查询,我不确定我是否了解更新要求。
  • 从您的表中添加示例数据以及执行更新后的预期结果。请edit您的问题并仅以文本格式添加,没有图像。
  • 请考虑不同的 DB 的主要区别在于 DDL,而不是 DML,而且 SELECTINSERTUPDATEDELETE 通常非常相似。尝试像在 TSQL 中那样编写它,并观察是否有任何需要调整的部分。

标签: oracle join plsql switch-statement oracle10g


【解决方案1】:

在这里推断您的要求有点困难,但是假设您编写的 SELECT 从 C_TABLE 返回行的源,那么只要您也检索主键,那么这将成为您用作源的东西标准 MERGE。

所以你最终会得到类似的东西

merge into TEST.C_TABLE c
using 
(
  SELECT 
  c.primary_key_column,
  C.NAME, 
  FROM TEST.C_TABLE C
  INNER JOIN
  (
      SELECT 
          CASE 
              WHEN LENGTH(TRIM(REPLACE(REPLACE(REPLACE(ID, '-', ''), '&&', ''), '"', ''))) = 15
              THEN TRIM(REPLACE(REPLACE(REPLACE(ID, '-', ''), '&&', ''), '"', '')) -- TRUE, because some rows causes problems...
              ELSE TRIM(REPLACE(REPLACE(REPLACE(SUBSTR(ID ,-9, 9), '-', ''), '&&', ''), '"', '')) -- FALSE 
          END ID,
          NAME
      FROM TEST.B_TABLE
  ) B
  ON B.NAME = C.NAME
  INNER JOIN A_TABLE A ON REPLACE(A.ID, '&&', '') = B.ID
) source_data
on  c.primary_key_column = source_data.primary_key_column
when matched then
   update set c.FLAG = source_data.?????

根据您提供给我们的信息,很难提供更多信息

【讨论】:

    猜你喜欢
    • 2021-01-15
    • 1970-01-01
    • 2023-03-07
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 2019-09-02
    相关资源
    最近更新 更多