如果内部SELECT包含无效标志符的,强制外部SELECT失败
技术问答
123 人阅读
|
0 人回复
|
2023-09-13
|
如果( q9 V0 n5 d7 c4 R
SELECT ID FROM T2失败 并显示以下消息:
5 Z1 L9 p4 p$ h$ L2 a错误:ORA-00904:“ ID:无效标识符
3 z' j& O ^3 X/ f为什么 不" E y, y3 r! d
SELECT * FROM T1 WHERE ID IN SELECT ID FROM T )失败了 ?(它回来了T1中所有条款)9 S3 K5 E! C# D. T
这种默认行为能否改变?
- U* B7 s3 p$ ~+ t9 U9 k [(查询操作相同,但收到错误而不是所有行)
9 m. { L5 ?. a& r( N我有:
& l+ n+ p8 b7 `. {ID为列的T1( D F/ z) a9 P" x! q
以ID2作为列的T2(T2不包含ID)但可以说我用了SELECT ID FROM T2(请参见上述示例)而不是SELECT ID2 FROMT2.错误使用。在这种情况下,没有错误,因为我用了SELECT ... IN SELECT...但如果替换,可能会造成重大损失DELETE ... IN SELECT ...。
; {+ J v1 ]& `+ g- T0 s3 \; ~# ~
% H* o3 R6 A* `5 W* @4 { 解决方案:
. @6 b- \7 e, N4 S 但你也问:这种默认行为可以改变吗?(操作相同的查询,但收到错误,而不是所有的行),并在注释中扩展了内容,我想强制失败,而不是更改查询以获得所需的结果。
4 N) s( d2 W d不,改变行为是不可能的。它正在按照文件说的去做:0 F1 {# Z1 i1 @9 @& o, f2 t
Oracle在子查询中命名的表中查找子查询,然后在父语句中命名的表中查找子查询中不合格的列。
3 L4 q6 K8 \2 h& ^您不能让它停止查看父语句,而只能解析子查询中的不合格别名。您将不得不更改查询以使其出错。没有理由 不
& a8 a+ t% W9 A% B6 \8 \" y有很多理由限制你的标识符,包括防止你掩盖代码中的错误。 |
|
|
|
|
|