从oracle 11g迁移到19c后出现错误

时间:2020-06-26 13:41:52

标签: sql oracle

任何人都可以解释以下选择的工作原理:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="row extra-attri-div">
   <div class="col appendeddiv">
      <div class="label-value">
         <label class="extraattrlebl" data-extraatt="environment">environment</label>
         <div class="value">
            <ul id="li-environment">
               <li>Suburban</li>
               <li>Urban</li>
            </ul>
         </div>
      </div>
   </div>
   <div class="col appendeddiv">
      <div class="label-value">
         <label class="extraattrlebl" data-extraatt="income_coarse">income_coarse</label>
         <div class="value">
            <ul id="li-income_coarse">
               <li>Middle Class</li>
               <li>Upper Middle Class</li>
               <li>Very High Income</li>
            </ul>
         </div>
      </div>
   </div>
   <div class="col appendeddiv">
      <div class="label-value">
         <label class="extraattrlebl" data-extraatt="age_coarse">age_coarse</label>
         <div class="value">
            <ul id="li-age_coarse">
               <li>Child</li>
               <li>Middle Aged</li>
               <li>Older</li>
               <li>Younger</li>
            </ul>
         </div>
      </div>
   </div>
   <div class="col appendeddiv">
      <div class="label-value">
         <label class="extraattrlebl" data-extraatt="family_stage">family_stage</label>
         <div class="value">
            <ul id="li-family_stage">
               <li>Family Mix</li>
               <li>Family Unknown</li>
               <li>W/ Kids</li>
               <li>W/O Kids</li>
            </ul>
         </div>
      </div>
   </div>
   <div class="col appendeddiv">
      <div class="label-value">
         <label class="extraattrlebl" data-extraatt="home_scale">home_scale</label>
         <div class="value">
            <ul id="li-home_scale">
               <li>Low Scale</li>
               <li>Medium Scale</li>
               <li>Upscale</li>
            </ul>
         </div>
      </div>
   </div>
   <div class="col appendeddiv">
      <div class="label-value">
         <label class="extraattrlebl" data-extraatt="education_imputed">education_imputed</label>
         <div class="value">
            <ul id="li-education_imputed">
               <li>Attended Vocational/Tech</li>
               <li>Completed College</li>
               <li>Completed Graduate School</li>
               <li>Completed High School</li>
            </ul>
         </div>
      </div>
   </div>
</div>

A.B。栏1 是什么意思?从oracle 11g迁移到19c后,我的程序包抛出错误:

select A.B.Column1 Col1
FROM TableA A LEFT JOIN TableB B
ON B.id=A.id;

2 个答案:

答案 0 :(得分:2)

它也不应该在11g中工作,但是ANSI语法有时会出现问题-特别是在较旧的版本中-并且您碰巧遇到了一个令人困惑但相当不错的问题。

在这种情况下,解析器/优化器显然忽略了对表模式的引用,但实际上不是。这似乎是在将ANSI语法内部转换为本地Oracle语法的过程中发生的。第一部分是什么都没有关系。您已经显示A与另一个表的别名匹配,但这是一个巧合;尽管Z从未在其他任何地方提及,但这两项工作至少在11.2.0.2中有效:

select A.B.Column1 Col1
FROM TableA A LEFT JOIN TableB B
ON B.id=A.id;

select Z.B.Column1 Col1
FROM TableA A LEFT JOIN TableB B
ON B.id=A.id;

我说过这是一个ANSI问题,因为(a)如您所述,它以内部联接出错,并且(b)老式的外部联接语法也出错:

select A.B.Column1 Col1
FROM TableA A, TableB B
WHERE B.id = A.id (+);

ORA-00904: "A"."B"."COLUMN1": invalid identifier

SQL Fiddle demo

没有太多地方担心它以前如何工作,或者(例如)针对这样的旧版本提出服务请求。这是旧版本Oracle中的一个错误,现已修复。它不应该起作用,并且由于它正确地在19c中不起作用,因此您必须通过删除杂散的A.来对其进行修复。

答案 1 :(得分:1)

SQL无效。

知道这只有两种可能性:

  1. 11g同样引发了错误;或
  2. 11g比19c具有更高的容错能力,并假设A还是B并在输出中应用了选择。

无论哪种方式,鉴于它都是您的包裹,解决方案应该相当简单:

  1. 如果您知道期望结果来自哪个表,则从别名中删除错误的表引用

  2. 如果A具有“ Column1”,而B没有删除“ B”。来自别名

  3. 如果B具有“ Column1”,而A没有删除“ A”。来自别名

  4. 如果A和B都具有“ Column1”,则找到一个11g数据库并创建一个 虚拟查询,其中A.id = B.id和A.Column1的值与 B.专栏1。然后运行查询,如果结果为A.Column1值 然后删除“ B”。来自别名,但如果结果为B.Column1, 删除“ A”。来自别名。

  5. 如果您尝试实现逻辑“如果B.Column1为null,则返回A.Column1的值,否则返回B.Column1的值”,然后更正您的SQL以使其类似于:

    select case
             when B.Column1 is null then
             A.Column1
           else
             B.Column1
           end as Col1
    from TableA A left join TableB B
    on B.id = A.id;