如果内部SELECT包含无效标识符,则强制外部SELECT失败

时间:2016-01-13 18:23:40

标签: sql oracle subquery correlated-subquery

如果

player_choice = ''
computer_choice = ''

def player_sign(player, computer):
    choice = raw_input("Do you want to be X or O?:  ").lower()
    while choice != 'x' and choice != 'o':
        print "Error!\n Wrong input!"
        choice = raw_input("Do you want to be X or Y?:  ").lower()
    if choice == 'x':
        print "X is yours!"
        player = 'X'
        computer = 'O'
        return player, computer
    elif choice == 'o':
        print "You've chosen O!"
        player = 'O'
        computer = 'X'
        return player, computer
    else:
        print "Error!\n Wrong input!"
        return 0
player_sign(player_choice, computer_choice)

失败,并显示以下消息:

  

错误:ORA-00904:" ID":无效标识符

为什么

SELECT ID FROM T2

失败? (它返回T1的所有条目)

是否可以更改此默认行为?
(运行相同的查询,但获取错误而不是所有行)

我有:

  • T1,ID为列
  • T2,ID2为列(T2不包含ID)

但是我们说我错误地使用SELECT * FROM T1 WHERE ID IN ( SELECT ID FROM T2 ) (请参阅上面的示例)而不是SELECT ID FROM T2。在这种情况下,没有任何错误发生,因为我使用SELECT ID2 FROM T2,但如果被SELECT ... IN SELECT ...取代,它可能会产生重大损失。

2 个答案:

答案 0 :(得分:4)

解释了行为in this question

但你也问:“是否有可能改变这种默认行为? (运行相同的查询,但得到错误而不是所有行)“并在评论中扩展,”我想强制同一查询的失败,而不是更改查询以获得想要的结果“。

不,不可能改变行为。它正在做the documentation所说的应该做的事情:

  

Oracle通过查看子查询中指定的表,然后查找父语句中指定的表,解析子查询中的非限定列。

您无法停止查看父语句,只能解析子查询中的非限定别名。您必须更改查询才能使其出错。没有理由来限定您的标识符,并且有充足的理由,包括它可以防止您屏蔽代码中的错误。

答案 1 :(得分:3)

SELECT * 
    FROM T1
    WHERE ID IN 
        ( 
            SELECT T2.ID FROM T2
        )