跨数据库操作 SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。

Join 和 Key

有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。我们就需要执行 join。

数据库中的表可通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。

请看 "Persons" 表:

Id_PLastNameFirstNameAddressCity
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_OOrderNoId_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 

 

结果集:

LastNameFirstNameOrderNo
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

 

结果集:

LastNameFirstNameOrderNo
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 INTO12 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  *
INTOFROM    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    本地表

 

posted @ 2014-11-10 18:20  Iriky  Views(254)  Comments(0)    收藏  举报