为什么不在子查询中出现"无效列名XYZ"错误; 虽然列名不在子查询表中?

Kas*_*hif 11 sql t-sql sql-server sql-server-2005 subquery

当我运行此查询时

SELECT CustomerId FROM Stocks.dbo.Suppliers
Run Code Online (Sandbox Code Playgroud)

它给了我这个错误.列名称'CustomerId'无效.此错误有效,因为Suppliers表中没有列CustomerId; 但是当我在子查询中使用相同的查询时,它不会给出任何错误.例如

SELECT * 
  FROM SomeOtherDb.dbo.Customer 
 WHERE CustomerId In( SELECT CustomerId 
                        FROM Stocks.dbo.Suppliers)
Run Code Online (Sandbox Code Playgroud)

在这里,我期待相同的错误"无效的列名称",但查询运行没有任何错误.

完全限定名称只是惯例,两个dbs都在同一台服务器上.

CustomerId确实存在于SomeOtherDb.dbo.Customer表中,但不存在于子查询中.

为什么会这样?这是子查询的东西吗?

谢谢.

Ban*_*i-T 14

子查询从外部查询继承列.

我想你的SomeOtherDb.dbo.Customer确实有一个CustomerId列(似乎也可能来自名称).

这也可能意味着你没有使用子查询你想用它做什么 - 如果子查询中的表没有CustomerId列(看起来如此,否则在运行子查询时不会出错)然后子查询选择并返回外部CustomerId,因为这是子查询中唯一的列,子查询是无用的.

  • 我自己也遇到过这种情况,虽然答案很有意义,但我认为这在SQL Server中是不好的设计(无论它是否完全实现了ISO SQL标准).我认为在引用父查询中的列时要求子查询使用别名会更安全.当他错误地更新生产表中的所有行时,由于上述子查询中的拼写错误,我的同事经历了相关的悲剧.随之而来的是欢闹(并从备份中恢复):) (6认同)