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'." 错误
有谁能解释一下?
仅供参考,这不是我的代码.我从这个链接得到了它
尝试:
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