多个数据库上的SQL查询

时间:2011-05-09 01:37:19

标签: sql sql-server

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

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, 
       saadmin.sa_repair_part@elgsad rp, 
       saadmin.sa_code_group_task_dtl@elgsad 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')

2 个答案:

答案 0 :(得分: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语句,那么就会像你描述的那样遇到麻烦。

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

答案 1 :(得分:1)

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

 FROM CXADMIN.RO_FAILURE_DTL RF
     INNER JOIN CXADMIN.RO_HIST RH
      ON  RF.REPAIR_ORD = RH.REPAIR_ORD
           ,
      saadmin.sa_repair_part@elgsad rp
      INNER JOIN saadmin.sa_code_group_task_dtl@elgsad cg
       ON RP.REPAIR_ORD = CG.REPAIR_ORD 

然后很容易看出您在RF join RHRP JOIN CG

之间创建了笛卡尔积

您需要将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 saadmin.sa_repair_part@elgsad rp
      ON  RF.REPAIR_ORD = RP.REPAIR_ORD
      INNER JOIN saadmin.sa_code_group_task_dtl@elgsad cg
       ON RP.REPAIR_ORD = CG.REPAIR_ORD 

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