0 sql-server t-sql subquery cross-join
这个查询有效
SELECT QMC.HAUSKEY, t1.STRNAME, t2.HAUS_NR
FROM SWOPS.MIGR.QMCAddresses QMC
CROSS JOIN (SELECT STRNAME FROM SWOPS.MIGR.EB_DICT_STREET_QMC WHERE FK=8055909) t1
CROSS JOIN (SELECT HAUS_NR FROM SWOPS.MIGR.EB_DICT_HAUSNR_QMC WHERE FK=8055909) t2
WHERE 1=1
AND QMC.HAUSKEY=8055909
ORDER BY HAUSKEY, t1.STRNAME, t2.HAUS_NR
Run Code Online (Sandbox Code Playgroud)
但是,当我用列引用 QMC.HAUSKEY 替换 CROSS JOIN 子查询中的常量 8055909 时,查询报告错误
Msg 4104, Level 16, State 1, Line 56 The multi-part identifier "QMC.HAUSKEY" could not be bound.
这是为什么?
背景:
QMCAddresses 包含建筑物及其地址
EB_DICT_STREET_QMC 包含 QMCAddresses 中地址的街道名称的可能变体
EB_DICT_STREET_HAUSNR 包含 QMCAddresses 中地址的门牌号的可能变化
我想做的是为每个建筑物地址创建一个笛卡尔积,其中包含其街道名称的所有可能变体和门牌号的所有可能变体。
例如
回答主要问题:
T-SQL 不支持相关的 CROSS JOIN 吗?
不,CROSS
连接在 SQL 中不相关(任何变体,不仅是 T-SQL)。
有解决方法吗?
是的。根据定义,相关联接不是CROSS
联接,可以通过相关子查询或横向联接来完成。横向连接在 SQL Server 中是通过 (CROSS/OUTER) 实现的APPLY
。
让我们稍微简化一下查询:
SELECT QMC.HAUSKEY, t1.STRNAME, t2.HAUS_NR
FROM SWOPS.MIGR.QMCAddresses QMC
CROSS JOIN
( SELECT STRNAME
FROM SWOPS.MIGR.EB_DICT_STREET_QMC
WHERE FK = 8055909
) t1
WHERE QMC.HAUSKEY = 8055909 ;
Run Code Online (Sandbox Code Playgroud)
这很好,^^,一个简单的 CROSS 连接。现在让我们来看看有问题的地方:
SELECT QMC.HAUSKEY, t1.STRNAME, t2.HAUS_NR
FROM SWOPS.MIGR.QMCAddresses QMC
CROSS JOIN
( SELECT STRNAME
FROM SWOPS.MIGR.EB_DICT_STREET_QMC
WHERE FK = QMC.HAUSKEY
) t1
WHERE QMC.HAUSKEY = 8055909 ;
Run Code Online (Sandbox Code Playgroud)
但是,当我用列引用替换 CROSS JOIN 子查询中的常量 8055909 时,
QMC.HAUSKEY
查询报告错误
Run Code Online (Sandbox Code Playgroud)Msg 4104, Level 16, State 1, Line 56 The multi-part identifier "QMC.HAUSKEY" could not be bound.
这是正确的,上面的语法无效。该标识符QMC.HAUSKEY
在派生表内不可见t1
。
解决此问题的最简单方法是将 CROSS join 转换为 CROSS(或 OUTER)APPLY:
SELECT QMC.HAUSKEY, t1.STRNAME, t2.HAUS_NR
FROM SWOPS.MIGR.QMCAddresses QMC
CROSS APPLY
( SELECT ca.STRNAME
FROM SWOPS.MIGR.EB_DICT_STREET_QMC AS ca
WHERE ca.FK = QMC.HAUSKEY
) t1
WHERE QMC.HAUSKEY = 8055909 ;
Run Code Online (Sandbox Code Playgroud)
这是一个有效的查询。
归档时间: |
|
查看次数: |
227 次 |
最近记录: |