Sql server 链接服务器和本地表连接

Sql server 链接服务器和本地表连接,sql-server,linked-server,openquery,Sql Server,Linked Server,Openquery,连接本地表和链接服务器表时遇到问题。我可以通过使用内部连接来完成,但是执行查询花费的时间太长了。 我知道有一种方法可以用OPENQUERY来实现,但我无法得到它 以下是我一开始所做的: SELECT DISTINCT local.L_ID FROM dbo.local_table AS local INNER JOIN [server].[db].[dbo].[TB_TEST] as ts on local.L_ID = ts.L_ID LEFT JO

连接本地表和链接服务器表时遇到问题。我可以通过使用内部连接来完成,但是执行查询花费的时间太长了。 我知道有一种方法可以用OPENQUERY来实现,但我无法得到它

以下是我一开始所做的:

SELECT DISTINCT 
                local.L_ID
FROM dbo.local_table AS local
INNER JOIN [server].[db].[dbo].[TB_TEST] as ts 
    on local.L_ID = ts.L_ID
LEFT JOIN [server].[db].[dbo].[TB_EXE] as ex 
    on ts.A_ID = ex.T_ID
现在我试着这样做:

SELECT DISTINCT 
                local.L_ID
FROM dbo.local_table AS local 
INNER JOIN (
    SELECT * 
    FROM OPENQUERY(SERVER,'SELECT L_ID FROM  TB_TEST'
    ) ts 
    on local.L_ID = ts.L_ID
left join OPENQUERY(SERVER,'SELECT T_ID FROM  TB_EXE') ex 
    on ts.A_ID = ex.T_ID
您能帮助我以正确的方式执行此操作以使查询运行更快吗?

由于当前实例与另一个实例的连接不良,或者如果其中一个服务器上使用的是较旧版本的SQL Server,这种查询(使用链接的服务器)可能会比较慢。更多信息在此

我建议您使用临时表:

SELECT * 
INTO #ts
FROM OPENQUERY(SERVER,'SELECT L_ID FROM  TB_TEST;')

SELECT * 
INTO #ex
FROM OPENQUERY(SERVER,'SELECT T_ID FROM  TB_EXE;')

SELECT DISTINCT 
                l.L_ID
FROM dbo.local_table AS l 
INNER JOIN #ts 
    on l.L_ID = ts.L_ID
LEFT JOIN #ex 
    on ts.A_ID = ex.T_ID

DROP TABLE #ts
DROP TABLE #ex
关于您的查询

您使用了几乎正确的语法。像这样尝试:

SELECT DISTINCT 
                local.L_ID
FROM dbo.local_table AS local 
INNER JOIN (
    SELECT * 
    FROM OPENQUERY(SERVER,'SELECT L_ID FROM  TB_TEST;')
    ) ts 
    on local.L_ID = ts.L_ID
left join (
    SELECT * 
    FROM OPENQUERY(SERVER,'SELECT T_ID FROM  TB_EXE;')
    ) ex 
    on ts.A_ID = ex.T_ID
或:


还请注意,您正在对第三个表使用左联接,并且根本不使用它。

如果绝对数据量很大,则无法改进链接服务器中的联接。考虑减少一个方面的数据量。关于链接服务器连接,旧版本的SQL Server不正确。您使用的是什么版本的SQL Server?谢谢!我使用第三个表来显示一个只存在于其中的列。
SELECT DISTINCT
                local.L_ID
FROM dbo.local_table AS local 
INNER JOIN OPENQUERY(SERVER,'SELECT L_ID FROM  TB_TEST;') ts 
    on local.L_ID = ts.L_ID
left join OPENQUERY(SERVER,'SELECT T_ID FROM  TB_EXE;') ex 
    on ts.A_ID = ex.T_ID