任何人都可以解释以下选择的工作原理:
<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;
答案 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
没有太多地方担心它以前如何工作,或者(例如)针对这样的旧版本提出服务请求。这是旧版本Oracle中的一个错误,现已修复。它不应该起作用,并且由于它正确地在19c中不起作用,因此您必须通过删除杂散的A.
来对其进行修复。
答案 1 :(得分:1)
SQL无效。
知道这只有两种可能性:
无论哪种方式,鉴于它都是您的包裹,解决方案应该相当简单:
如果您知道期望结果来自哪个表,则从别名中删除错误的表引用
如果A具有“ Column1”,而B没有删除“ B”。来自别名
如果B具有“ Column1”,而A没有删除“ A”。来自别名
如果A和B都具有“ Column1”,则找到一个11g数据库并创建一个 虚拟查询,其中A.id = B.id和A.Column1的值与 B.专栏1。然后运行查询,如果结果为A.Column1值 然后删除“ B”。来自别名,但如果结果为B.Column1, 删除“ A”。来自别名。
如果您尝试实现逻辑“如果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;