Sql 在多部分from语句中命名表

Sql 在多部分from语句中命名表,sql,sql-server,Sql,Sql Server,我正在运行一个查询,其中有3个独立标识符的表变量。我想交叉连接它们以匹配另一个表中的每个组合 这个很好 select i.*, d.* from @ids as i, @dates as d, @values as v 但是当我跑的时候 select i.*, d.* from @ids as i, @dates as d, @values as v join other_table as ot with (nolock) on i.id_ = ot.someid a

我正在运行一个查询,其中有3个独立标识符的表变量。我想交叉连接它们以匹配另一个表中的每个组合

这个很好

select i.*, d.*
  from @ids as i, @dates as d, @values as v
但是当我跑的时候

select i.*, d.*
  from @ids as i, @dates as d, @values as v
  join other_table as ot with (nolock)
    on i.id_ = ot.someid
   and d.date_ = ot.somedate
   and v.item_ = ot.someitem
只有最后一个表v被识别,我得到

Msg 4104, Level 16, State 1, Line 10084
The multi-part identifier "d.date_" could not be bound.
Msg 4104, Level 16, State 1, Line 10085
The multi-part identifier "v.item_" could not be bound.
这样做的适当方法是什么?

简单规则。请勿在FROM子句中使用逗号。始终使用正确的显式联接语法

在您的情况下,您需要交叉连接:

逗号与交叉连接并不完全相同。除了生成表中行的笛卡尔乘积外,它还具有范围界定含义。基本上,逗号分隔FROM子句中的名称空间。因此,逗号之前定义的表/别名在逗号之后不可用。当然,它们可以在查询中的其他子句中使用,例如WHERE

select i.*, d.*
from @ids i cross join
     @dates d cross join
     @values v join
     other_tabl ot
     on i.id_ = ot.someid and
        d.date_ = ot.somedate snf
        v.item_ = ot.someitem;