Как я могу присоединиться к таблице MS-SQL и MySQL в запросе?

#c# #asp.net #mysql #sql #sql-server

#c# #asp.net #mysql #sql #sql-сервер

Вопрос:

Я хочу выполнить соединение с базой данных MS-SQL и MySQL.

Запрос MS-SQL эффективно генерирует индекс, а затем я хочу вернуть все записи MySQL, которые соответствуют результату этого запроса. (Я мог бы вернуть обе таблицы, то есть нефильтрованные данные из MySQL, а затем отфильтровать с помощью Linq, но это будет неэффективно, поскольку я буду извлекать больше данных, чем мне нужно.)

Запрос MS-SQL выполняется через Linq:

 var fb1 = from f in db.tl_feedbacks  
          where f.timestamp >= new DateTime(fromYear, fromMonth, fromDay)
             amp;amp; f.timestamp <= new DateTime(toYear, toMonth, toDay)   
          select new {f.requestID, f.tl_feedback_score.score };
  

Это вернет таблицу, подобную этой:

 RequestID | score
-----------------
12345     | 1
12349     | 3
12446     | 3
  

и т.д.

Из этого я хочу вернуть только те записи из следующего запроса MySQL, которые имеют RequestID в приведенной выше таблице:

 SELECT wo.WORKORDERID,
       COALESCE(ti.FIRST_NAME,'Not Assigned') AS 'Technician',
       COALESCE(cd.CATEGORYNAME, 'Not Assigned') AS Category,
       COALESCE(scd.NAME, 'Not Assigned') AS Subcategory,
       wof.UDF_CHAR1 "Office Location"  
FROM WorkOrder_Threaded wot  
INNER JOIN WorkOrder wo ON wot.WORKORDERID=wo.WORKORDERID  
LEFT JOIN SDUser sdu ON wo.REQUESTERID=sdu.USERID  
LEFT JOIN AaaUser aau ON sdu.USERID=aau.USER_ID  
LEFT JOIN WorkOrderStates wos ON wo.WORKORDERID=wos.WORKORDERID  
LEFT JOIN SDUser td ON wos.OWNERID=td.USERID  
LEFT JOIN AaaUser ti ON td.USERID=ti.USER_ID  
LEFT JOIN CategoryDefinition cd ON wos.CATEGORYID=cd.CATEGORYID  
LEFT JOIN SubCategoryDefinition scd ON wos.SUBCATEGORYID=scd.SUBCATEGORYID  
LEFT JOIN WorkOrder_Fields wof ON wo.WORKORDERID=wof.WORKORDERID  
  

т.е. я хочу только вернуть записи 12345, 12349 и 12446 в этом примере. В конечном счете мне нужна одна единственная таблица, в которой есть RequestID, score и столбцы из запроса MySQL. Однако, если я смогу вернуть «отфильтрованную» таблицу MySQL, я смогу впоследствии объединить их. Я просто не хочу возвращать MySQL «нефильтрованным», так как таблица будет огромной.

Ответ №1:

С правильными драйверами базы данных OLEDB (я делал это только с PGSQL, поэтому не могу посоветовать), вы можете создать связанный сервер в MSSQL. Вот пошаговое руководство, а вот еще одно.

Затем вы можете запросить его с помощью OPENQUERY следующим образом в MSSQL:

 select * from openquery(LinkedServerDb,'select * from remotetable')
  

и присоединиться:

 select 
    * 
from 
    openquery(LinkedServerDb,'select * from remotetable') remoteTable
    join localTable on remotetable.someid=localtable.otherid