查询不存在的列不会失败

Die*_*ego 3 sql sql-server sql-server-2008

奇怪的情况.

如果我有这些表:

CREATE TABLE t1 (id INT, title VARCHAR(20), someIntCol INT)
GO
CREATE TABLE t2 (id INT, t1Id INT, someData VARCHAR(20))
GO
Run Code Online (Sandbox Code Playgroud)

并做:

SELECT    t1.* 
FROM    t1 
WHERE    t1.id IN (SELECT someIntCol FROM t2)
Run Code Online (Sandbox Code Playgroud)

奇怪的是:解析器并不介意列someIntCol不存在

最奇怪的事情:如果我将someIntCol更改为someIntCol2,我会得到一个"无效的列名'someIntCol2'." 错误

有谁能解释一下?

仅供参考,这不是我的代码.我从这个链接得到了它

Cur*_*urt 6

尝试:

SELECT    t1.* 
FROM    t1 
WHERE    t1.id IN (SELECT t2.someIntCol FROM t2)
Run Code Online (Sandbox Code Playgroud)

这将在执行时抛出异常.

因为someIntCol存在t1,它正在使用主查询中的数据项.

子查询能够使用主查询中的数据项.因此,为避免这种情况,请在输入数据项时指定表名:

SELECT [TableName].[ColumnName]
Run Code Online (Sandbox Code Playgroud)

如果在t1和中有2个具有相同名称的列,这也可以防止出现歧义t2


这是一个MSDN,可以让您更好地了解子查询的工作原理:

http://msdn.microsoft.com/en-us/library/aa213262(v=sql.80).aspx

  • +1:始终指定表名,否则您可能引用另一个表中的列,可能来自更广泛的范围. (2认同)