Есть несколько способов добраться туда.
Brute Force
Внутри вашей задачи потока данных (DFT) вы могли бы повторить ваш начальный запрос в Lookup Transformation
. Поиски поддерживают набор результатов из нескольких столбцов. Поток данных из источника в поиск, а затем на вкладке Columns
, выберите свои результаты.
Умеренно более элегантно
Если вы захватите этот начальный запрос как VIEW
в вашей базе данных, вы можете использовать это представление в качестве источника, опять же, для Lookup Transformation
. Таким образом, у вас есть только одно место для его обслуживания, если базовый запрос необходимо изменить в будущем.
Как я, вероятно, начну
Проблема с поиском в том, что они потребляют память. Если ваш источник поиска составляет несколько сотен или даже несколько тысяч строк, на самом деле это не проблема. Но если вы наберете, скажем, 3-5 миллионов записей, это может начать реально влиять на ваш сервер приложений и нагрузку на память.
Имея это в виду, я снова склоняюсь к захвату логики в представлении, но затем присоединяюсь к представлению в запросе ODBC Source. Это перенесет тяжелый груз обратно на коробку SQL Server, которая предназначена для выполнения именно такой работы, и оставляет SSIS для обработки передачи данных, которая отлично справляется с обработкой.
SELECT ...
FROM ....
LEFT JOIN ( a INNER JOIN b ON .... ) ON ....
добавить оператор where (main.col2 = a.col2)
просто сделать соединение вместо левого соединения .
Что, если вы создали представление, которое соединяет вас от a до b, тогда ваши левые присоединяются к этому виду?
Select ...
From Main
Left Join a on main.col2 = a.col2
where a.col3 in (select b.col3 from b) or a.col3 is null
вам также может потребоваться выполнить индексацию для a.col3 и b.col3
Сначала определите ваш запрос между таблицами «a» и «b», чтобы убедиться, что он возвращает нужные вам строки:
Select
a.field1,
a.field2,
b.field3
from
table_a a
JOIN table_b b
on (b.someid = a.someid)
затем поместите это как подзапрос вашего основного запроса:
select
m.field1,
m.field2,
m.field3,
a.field1 as a_field1,
b.field1 as b_field1
from
Table_main m
LEFT OUTER JOIN
(
Select
a.field1,
a.field2,
b.field3
from
table_a a
JOIN table_b b
on (b.someid = a.someid)
) sq
on (sq.field1 = m.field1)
, который должен это сделать.
Ааа, пропустил примечание по проблеме производительности - что я обычно заканчиваю тем, что делаю запрос из представления в хранимая процедура, поэтому я могу генерировать подзапросы к временным таблицам и помещать в них индексы. Удивительно быстрее, чем вы ожидаете. : -)