跨数据库操作 SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
Join 和 Key
有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。我们就需要执行 join。
数据库中的表可通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。
请看 "Persons" 表:
| Id_P | LastName | FirstName | Address | City |
|---|---|---|---|---|
| 1 | Adams | John | Oxford Street | London |
| 2 | Bush | George | Fifth Avenue | New York |
| 3 | Carter | Thomas | Changan Street | Beijing |
请注意,"Id_P" 列是 Persons 表中的的主键。这意味着没有两行能够拥有相同的 Id_P。即使两个人的姓名完全相同,Id_P 也可以区分他们。
接下来请看 "Orders" 表:
| Id_O | OrderNo | Id_P |
|---|---|---|
| 1 | 77895 | 3 |
| 2 | 44678 | 3 |
| 3 | 22456 | 1 |
| 4 | 24562 | 1 |
| 5 | 34764 | 65 |
请注意,"Id_O" 列是 Orders 表中的的主键,同时,"Orders" 表中的 "Id_P" 列用于引用 "Persons" 表中的人,而无需使用他们的确切姓名。
请留意,"Id_P" 列把上面的两个表联系了起来。
1. 两表关联查询
引用两个表
我们可以通过引用两个表的方式,从两个表中获取数据:
谁订购了产品,并且他们订购了什么产品?
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons, Orders WHERE Persons.Id_P = Orders.Id_P
结果集:
| LastName | FirstName | OrderNo |
|---|---|---|
| Adams | John | 22456 |
| Adams | John | 24562 |
| Carter | Thomas | 77895 |
| Carter | Thomas | 44678 |
SQL JOIN - 使用 Join
除了上面的方法,我们也可以使用关键词 JOIN 来从两个表中获取数据。
如果我们希望列出所有人的定购,可以使用下面的 SELECT 语句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons INNER JOIN Orders ON Persons.Id_P = Orders.Id_P ORDER BY Persons.LastName
结果集:
| LastName | FirstName | OrderNo |
|---|---|---|
| Adams | John | 22456 |
| Adams | John | 24562 |
| Carter | Thomas | 77895 |
| Carter | Thomas | 44678 |
2.跨Sql服务器数据库 两表关联查询
1.使用连接服务器
1 --创建链接服务器 2 EXEC sp_addlinkedserver 'DBSV', ' ', 'SQLOLEDB ', '远程数据库的IP或主机名 ' 3 EXEC sp_addlinkedsrvlogin 'DBSV ', 'false ', NULL, '登录名 ', '密码 ' 4 5 --查询示例 6 SELECT * 7 FROM DBSV.数据库名.dbo.表名 8 9 --导入示例 10 SELECT * 11 INTO 表 12 FROM DBSV.数据库名.dbo.表名 13 14 --以后不再使用时删除链接服务器 15 EXEC sp_dropserver 'DBSV ', 'droplogins
2.使用 openrowset/openquery/opendatasource 直接读取 不需要连接服务器
--不需要创建连接服务器 --连接远程/局域网数据(openrowset/openquery/opendatasource) --查询示例 SELECT * FROM OPENROWSET('SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ', 数据库名.dbo.表名) --生成本地表 SELECT * INTO 表 FROM OPENROWSET('SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ', 数据库名.dbo.表名) --把本地表导入远程表 INSERT OPENROWSET('SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ', 数据库名.dbo.表名) SELECT * FROM 本地表 --更新本地表 UPDATE b SET b.列A = a.列A FROM OPENROWSET('SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ', 数据库名.dbo.表名) AS a INNER JOIN 本地表 b ON a.column1 = b.column1 --openquery用法需要创建一个连接 --首先创建一个连接创建链接服务器 EXEC sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 ' --查询 SELECT * FROM OPENQUERY(ITSV, 'SELECT * FROM 数据库.dbo.表名 ') --把本地表导入远程表 INSERT OPENQUERY(ITSV, 'SELECT * FROM 数据库.dbo.表名 ') SELECT * FROM 本地表 --更新本地表 UPDATE b SET b.列B = a.列B FROM OPENQUERY(ITSV, 'SELECT * FROM 数据库.dbo.表名 ') AS a INNER JOIN 本地表 b ON a.列A = b.列A --3、opendatasource/openrowset SELECT * FROM OPENDATASOURCE('SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ').test.dbo.roy_ta --把本地表导入远程表 INSERT OPENDATASOURCE('SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ').数据库.dbo.表名 SELECT * FROM 本地表

浙公网安备 33010602011771号