回答

收藏

如果内部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有很多理由限制你的标识符,包括防止你掩盖代码中的错误。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则