【问题标题】:CHECK IF JOIN IS SUCCESSFUL检查加入是否成功
【发布时间】:2020-06-05 02:33:26
【问题描述】:

我正在创建一个 oracle 查询,它将向目标表插入有关列的信息,以检查其他 2 个表的左连接是否成功。该过程的一部分是使用 3 个不同的 ID 检查连接结果。

Target - Table3.JoinCheck 

Joining Table (Source 1 and 2)
Source1 - Table1.Key1,
          Table1.Key2,
          Table1.Key3

Source2 - Table2.Key1

我想在 table1.key1 = table2.key1、table1.key2 = table2.key1、table1.key3 = table2.key1 上使用表 1 和 2 进行左连接。如果其中任何一个连接成功,它将向 Table3.JoinCheck 返回“OK”。如果不成功,我想返回如下错误信息:'table1.key1 = table2.key1 not match','table1.key2 = table2.key1 not match', 'table1.key3 = table2.key1 not match'

INSERT INTO table3 (JoinCheck) c 
  SELECT CASE
           WHEN a.key1 IS NOT NULL
             OR a.key2 IS NOT NULL
             OR a.key3 IS NOT NULL
           THEN 'OK'
         CASE
           WHEN a.key1 IS NULL
           THEN 'table1.key1 = table2.key1 not matched'
         CASE 
           WHEN a.key2 IS NULL
           THEN 'table1.key2 = table2.key1 not matched'
         CASE
           WHEN a.key3 IS NULL
           THEN 'table1.key3 = table2.key1 not matched'
         END AS Joincheck
  FROM table1 a
  LEFT JOIN table2 b
    ON a.key1 = b.key1
    OR a.key2 = b.key1
    OR a.key3 = b.key1

【问题讨论】:

  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你期望的内容和原因。
  • 不清楚你想用什么级别的软件做什么。 “检查是否”和“返回以下错误消息”含糊不清。请澄清。 PS 请在发帖前查看编辑框下方帖子的格式化版本。阅读代码和引用的内联和块格式的编辑帮助。

标签: sql oracle join


【解决方案1】:

您的 CASE 表达式不正确,不会执行。试试

INSERT INTO table3 (JoinCheck) c 
  SELECT CASE
           WHEN a.key1 IS NOT NULL
               OR a.key2 IS NOT NULL
               OR a.key3 IS NOT NULL
             THEN 'OK'
           WHEN a.key1 IS NULL
             THEN 'table1.key1 = table2.key1 not matched'
           WHEN a.key2 IS NULL
             THEN 'table1.key2 = table2.key1 not matched'
           WHEN a.key3 IS NULL
             THEN 'table1.key3 = table2.key1 not matched'
         END AS Joincheck
  FROM table1 a
  LEFT JOIN table2 b
    ON a.key1 = b.key1
    OR a.key2 = b.key1
    OR a.key3 = b.key1

此外,如果 table1.key1table1.key2table1.key3table2.key 中的任何一个为 NULL,则 ON 子句中的 OR 比较将失败,因为任何与 NULL 的比较都返回 NULL 而不是 TRUE 或 FALSE。在比较时,您可能需要确保这些值不为 NULL。也许像

  LEFT JOIN table2 b
    ON NVL(a.key1, -1) = NVL(b.key1, -2)
    OR NVL(a.key2, -1) = NVL(b.key1, -2)
    OR NVL(a.key3, -1) = NVL(b.key1, -2)

这假设您的所有键值都不能是 -1 或 -2 - 如果不是,请选择其他值。

【讨论】:

  • 嗨 Bob,我不确定在这种情况下使用 LEFT JOIN 是否合适。我相信使用这样的方法总是会从表 1 中返回不匹配的 key1、key2、key3 值,这实际上违背了 CASE WHEN 语句的目的。
猜你喜欢
  • 1970-01-01
  • 2018-04-15
  • 2023-03-23
  • 2018-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
相关资源
最近更新 更多