我在一台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')
答案 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 RH
和RP 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子句