在multipart from语句中命名表

时间:2017-03-31 00:47:25

标签: 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
   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.

这样做的恰当方法是什么?

1 个答案:

答案 0 :(得分:1)

简单的规则。 从不FROM子句中使用逗号。 始终使用正确的JOIN语法。

在您的情况下,您需要CROSS JOIN

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;

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