SQL Server 2012链接服务器错误

时间:2015-06-28 08:28:26

标签: sql-server select sql-server-2012

当我从链接的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是指向远程服务器上的表的同义词。

2 个答案:

答案 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