我正在运行一个查询,其中有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.
这样做的恰当方法是什么?
答案 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
。)