2011-05-09 234 views
11

我在一个sql服务器上有两个数据库,我必须将两个表从一个数据库服务器链接到另一个数据库服务器中的两个表以获取我需要的信息。问题是,当我尝试链接来自第二个数据库服务器的两个表时,查询将返回1000或更多的重复项。我如何在两个数据库上运行单个查询?所有表格都有repair_ord列。有人可以帮帮我吗?谢谢。多个数据库上的SQL查询

server 1 = CXADMIN SERVER 2 = SAADMIN

这里是我的查询看起来像至今:

SELECT RF.REPAIR_ORD, 
     RH.RECV_UNIT, 
     RH.RECV_SERIAL_NBR, 
     RP.FAULT_CODE, 
     RP.REPAIR_ACTION_CODE, 
     CG.TASK_CODE 
    FROM CXADMIN.RO_FAILURE_DTL RF, 
     CXADMIN.RO_HIST RH, 
     [email protected] rp, 
     [email protected] cg 
WHERE RF.REPAIR_ORD = RH.REPAIR_ORD 
    AND RP.REPAIR_ORD = CG.REPAIR_ORD 
    AND RF.FAILURE_CODE ='DISK' 
    AND RH.CURR_FACILITY_ID ='23' 
    AND RF.CREATED_DATE >'1-JUN-2010' 
    AND RF.CREATED_DATE < '1-JUL-2010' 
    AND ( CG.TASK_CODE ='PHMD' 
     OR CG.TASK_CODE ='PHSN' 
     OR CG.TASK_CODE ='CHMD' 
     OR CG.TASK_CODE ='CHSN') 
+1

为什么你不只是'联盟所有'他们呢? – zerkms 2011-05-09 01:43:44

+1

使用JOIN时(您的查询使用ANSI-89 JOIN语法)会出现重复项,因为父记录具有多个子记录。我们不知道您的数据 - 注释掉表格,并逐渐添加它们以知道哪些连接负责。 – 2011-05-09 01:51:41

+0

@zerkms,我试过联合功能,但我很困惑如何使用它在这个查询B/C所有表相同。他们只有repair_ord列相同。 – Justin 2011-05-09 02:28:27

回答

8

我想重复的问题不是连接两个数据库之一,而是在你的加入摆在首位。我想你可能需要一个INNER或OUTER连接来处理链接。至于从两个不同的数据库获取数据,语法非常简单。您只需添加服务器名称点数据库名称点所有者名称点表名称。

例如:

SELECT firstdb.*, seconddb.* 
FROM Server1.Database1.dbo.myTable AS firstdb 
INNER JOIN Server2.Database2.dbo.myTable AS seconddb 
    ON firstdb.id = seconddb.id 

在你的榜样,这听起来像你所得到的链接工作,但你对repair_ord领域的加盟问题。虽然我不知道你的模式,但我猜想这个链接应该是一个INNER JOIN。如果您只是在FROM语句中添加这两个表,并且您没有正确执行WHERE语句,则会像您所描述的那样陷入麻烦。

我建议你简化这个设置并把它放在一个测试环境中(在一个数据库上)。尝试四表连接,直到你做对了。然后添加多数据库调用的复杂性。

+0

对此有何建议? http://dba.stackexchange.com/questions/102170/selecting-rows-from-same-name-table-from-multiple-database-in-single-result-set – xameeramir 2015-05-21 16:10:48

1

如果你改写了FROM子句中使用ANSI 92,你会得到这个

FROM CXADMIN.RO_FAILURE_DTL RF 
    INNER JOIN CXADMIN.RO_HIST RH 
     ON RF.REPAIR_ORD = RH.REPAIR_ORD 
      , 
     [email protected] rp 
     INNER JOIN [email protected] cg 
     ON RP.REPAIR_ORD = CG.REPAIR_ORD 

然后,它变得容易看到你创建RF join RHRP JOIN CG

你需要之间的笛卡尔积JOIN RF到RP或CG,或RH至RP或CG

例如

FROM CXADMIN.RO_FAILURE_DTL RF 
    INNER JOIN CXADMIN.RO_HIST RH 
     ON RF.REPAIR_ORD = RH.REPAIR_ORD 
     INNER JOIN [email protected] rp 
     ON RF.REPAIR_ORD = RP.REPAIR_ORD 
     INNER JOIN [email protected] cg 
     ON RP.REPAIR_ORD = CG.REPAIR_ORD 

或者如果您坚持使用ANSI-86样式的连接,您可以将AND RF.REPAIR_ORD = RP.REPAIR_ORD添加到您的Where子句中