当我从链接的SQL Server 2012中运行select时:
select A.*
from A, (select TOP 1 * from B) as B
where A.test in (B.col1, B.col2)
我只从A获得1行,但A有很多行。 B这里是只有1行的参数表。
这里的A和B是指向远程服务器上的表的同义词。
答案 0 :(得分:0)
我们知道没有ORDER BY的TOP可能会产生非确定性结果,但如果我们在表中只有1行,那么它必须是正确的。但是,MS SQL Server 2012在问题的情况下做他的工作非常糟糕。要避免此类问题,您必须在嵌套表(B)中编写ORDER BY!之后,查询给出正确的结果。因此,正确的查询必须是:
select A.*
from A, (select TOP 1 * from B ORDER BY <any field>) as B
where A.test in (B.col1, B.col2)
考虑到SQL Server在本地服务器上运行良好,但在链接服务器的情况下工作方式不同。
答案 1 :(得分:0)
在给定的查询中,连接结构被视为a 交叉加入 ,所以通过添加过滤器 哪里 您正在有效地将连接条件更改为 内部联接 遵循此连接结构。如果您使用ANSI-92 SQL标准,那么维护代码的其他人也会更好。
考虑这样的查询:
SELECT A.*
FROM A
INNER JOIN
(
SELECT col1 AS test FROM B
UNION
SELECT col2 AS test FROM B
) C
ON A.test = C.test