sql-server - OPENDATASOURCE (Transact-SQL) - 连接到多个表
问题描述
我有一个 OPENDATASROUCE 的用例。但是,我的 SQL 查询有多个带有左连接的表。大多数示例只有一张表。如果我有 2 个表(第 2 个表已离开连接),我如何连接
下面是一个典型的例子,效果很好:
SELECT *
FROM OPENDATASOURCE('SQLNCLI', 'Data Source=RemoteServerName;Integrated Security=SSPI').Billing.dbo.Invoices
但我需要将发票表与下面的“客户”表连接起来。我不知道我是怎么做到的??请帮忙
SELECT *
FROM OPENDATASOURCE('SQLNCLI', 'Data Source=RemoteServerName;Integrated Security=SSPI').Billing.dbo.Invoices as inv
left join Billing.dbo.customers as cust
on inv.customer = cust.customer
解决方案
OPENDATASOURCE 是使用 SQL Server 中的“链接服务器”或“分布式查询”功能与远程服务器通信的一种方式。但是,这可能不是您在这种情况下使用的最佳路径,因为它不允许 SQL Server 查询优化器重写查询并将部分查询推送到远程源(可能会减少返回的行数通过较慢的网络连接与您的本地数据库给您)。如果可能的话,创建一个实际的链接服务器会在这里为您提供帮助。这将使您可以选择对优化器说“这两个表来自同一个远程源”。然后优化器可以考虑将单个查询远程连接到将这两个表连接在一起的远程服务器的计划,应用任何过滤器和 group by 子句,
一旦你有了一个远程服务器(我在这里称之为“远程”),你可以使用远程服务器的 4 部分名称语法而不是使用 OPENDATASOURCE 来编写查询。
SELECT * FROM REMOTE.Billing.DBO.Invoices LEFT JOIN REMOTE.Billing.DBO.Invoices on <join condition> <WHERE clause>
这是一篇关于链接服务器如何在幕后工作的论文,它应该给你一个概念性的概述,说明为什么这种方法可能更适合你: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1。 1.59.8007
祝你好运!
推荐阅读
- php - 我想,当用户登录应用程序 A 时,他应该在同一服务器(本地主机或 cPanel)上的 Laravel 中登录应用程序 B
- python - 枚举 KeyError 函数
- apache-spark - 在公司开发时如何测试 Spark 应用性能?
- python - python中列表之间映射的最快方法是什么
- performance - jmeter聚合报告的时间过滤器并将其再次保存为jtl
- python - 调用可以从多个地方调用的类的最佳方式
- jquery - 单击时如何切换单个三角形类
- sql - 计数(不同)不适用于 SQL Server 2016 中的多个内部联接
- java - JPA CriteriaQuery - 如何使用 IN 比较运算符
- r - 为什么以及何时“不建议对离散变量使用大小”?