【问题标题】:Oracle 11g left join issueOracle 11g 左连接问题
【发布时间】:2018-03-07 09:59:31
【问题描述】:

尝试像这样创建一个示例数据库:

    CREATE TABLE "APP" 
   (    "CODICE" VARCHAR2(20 BYTE)
   );

Insert into APP (CODICE) values ('A');
Insert into APP (CODICE) values ('B');
Insert into APP (CODICE) values ('C');
Insert into APP (CODICE) values ('D');
Insert into APP (CODICE) values ('E');

CREATE TABLE "APP2" 
   (    "CODICE" CHAR(1 BYTE), 
    "STATO" VARCHAR2(20 BYTE)
   );

Insert into APP2 (CODICE,STATO) values ('A','E');
Insert into APP2 (CODICE,STATO) values ('B','E');
Insert into APP2 (CODICE,STATO) values ('C','E');

现在,试试这样的左连接:

select app.codice codice1, 
    case 
      when app.codice in ('A','B','C') then 'OK'
      when app.codice in ('D','E') then 'KO'
      end azione,
      tt.codice codice2, 
      tt.stato
from app left join (select app2."CODICE", 'E' stato
from app2) tt on app.codice=tt.codice

结果很奇怪,“stato”列属于右表,所以,在左连接中,如果右键为空,则应该为空,所以如果codice2为空。 对于 codice=D 或 E,右表不匹配,但 stato 列不为空。 如果将静态列 'E' stato 替换为表 app2 中的实际列 stato,则不会发生这种情况

【问题讨论】:

  • 向我们展示当前结果以及您想要的结果。 (请格式化文本。)
  • 在下面完成.....

标签: sql oracle oracle11g left-join outer-join


【解决方案1】:

您将app2 外连接到app。因此,您选择来自app 的所有记录以及它们在app2 中的所有匹配项(如在内部连接中)以及来自app 的在app2 中没有匹配项的记录。这正是你得到的

CODE1 AZIONE CODE2 STATO A 好的 A E B 好的 B E C 好 C E E KO NULL NULL D KO NULL NULL

app 记录 A、B 和 C 在app2 中各有一个匹配项。 app 记录 E 和 F 没有。

你会得到同样的结果

left join (select app2."CODICE", 'E' stato from app2) tt on app.codice=tt.codice

left join (select app2."CODICE", app2.stato from app2) tt on app.codice=tt.codice

left join app2 tt on app.codice=tt.codice

当然当app2 中的所有记录都有stato = 'E'

【讨论】:

  • 是的,你的结果是我所期望的,但不是我得到的。我的最后 2 条记录有 STATO=E。如果我删除 case 语句,我会得到正确的结果。这是我的 Oracle 版本:Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
  • 对我来说很好。相同的版本。见这里:rextester.com/WOFW4225
  • 不,如果您卸下 azione 柱(卸下外壳),它也适用于我,请尝试像我这样的外壳...
  • 在 sqlfiddle 中也可以正常工作,如 rextester,相同版本。所以,也许快递版没有企业版的bug.....奇怪
  • 另一个测试:在“Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production”中它也可以正常工作。但是,当然,Enterprise 11.2.0.2.0 可能仍然存在 Express 11.2.0.2.0 和 Enterprise 11.2.0.4.0 都没有的 bug。
猜你喜欢
  • 1970-01-01
  • 2012-10-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2011-09-27
  • 1970-01-01
  • 1970-01-01
  • 2014-12-02
相关资源
最近更新 更多