SQL-запрос для нескольких баз данных

У меня есть две базы данных на одном сервере sql, и мне нужно связать две таблицы с одного сервера БД на две таблицы на другом сервере БД, чтобы получить нужную мне информацию. Проблема в том, что когда я пытаюсь связать две таблицы со второго сервера БД, запрос возвращает дубликаты от 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, 
       [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

Я думаю, что проблема с дубликатами не связана с объединением двух баз данных, а скорее в вашем соединении. Я думаю, вам может понадобиться соединение INNER или OUTER для обработки ссылок. Что касается получения данных из двух разных баз данных, синтаксис довольно прост. Вы просто добавляете имя сервера dot имя базы данных dot имя владельца dot имя таблицы.

Например:

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, вы столкнетесь с проблемами, которые вы описываете.

Я бы предположил, что вы упростите эту настройку и поместите ее в тестовую среду (на одну БД). Попробуйте соединение с четырьмя столами, пока не получите правильное решение. Затем добавьте сложности вызовов с несколькими базами данных.

Ответ 2

Если вы переписали предложение 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 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 [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