Ограничение ЛЕВОГО СОЕДИНЕНИЯ

Есть несколько способов добраться туда.

Brute Force

Внутри вашей задачи потока данных (DFT) вы могли бы повторить ваш начальный запрос в Lookup Transformation. Поиски поддерживают набор результатов из нескольких столбцов. Поток данных из источника в поиск, а затем на вкладке Columns, выберите свои результаты.

Умеренно более элегантно

Если вы захватите этот начальный запрос как VIEW в вашей базе данных, вы можете использовать это представление в качестве источника, опять же, для Lookup Transformation. Таким образом, у вас есть только одно место для его обслуживания, если базовый запрос необходимо изменить в будущем.

Как я, вероятно, начну

Проблема с поиском в том, что они потребляют память. Если ваш источник поиска составляет несколько сотен или даже несколько тысяч строк, на самом деле это не проблема. Но если вы наберете, скажем, 3-5 миллионов записей, это может начать реально влиять на ваш сервер приложений и нагрузку на память.

Имея это в виду, я снова склоняюсь к захвату логики в представлении, но затем присоединяюсь к представлению в запросе ODBC Source. Это перенесет тяжелый груз обратно на коробку SQL Server, которая предназначена для выполнения именно такой работы, и оставляет SSIS для обработки передачи данных, которая отлично справляется с обработкой.

5
задан Paul Tomblin 16 April 2009 в 20:40
поделиться

5 ответов

SELECT ...
FROM ....
LEFT JOIN ( a INNER JOIN b ON .... ) ON ....
6
ответ дан 14 December 2019 в 01:16
поделиться
  1. добавить оператор where (main.col2 = a.col2)

  2. просто сделать соединение вместо левого соединения .

3
ответ дан 14 December 2019 в 01:16
поделиться

Что, если вы создали представление, которое соединяет вас от a до b, тогда ваши левые присоединяются к этому виду?

0
ответ дан 14 December 2019 в 01:16
поделиться
    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

0
ответ дан 14 December 2019 в 01:16
поделиться

Сначала определите ваш запрос между таблицами «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)

, который должен это сделать.

Ааа, пропустил примечание по проблеме производительности - что я обычно заканчиваю тем, что делаю запрос из представления в хранимая процедура, поэтому я могу генерировать подзапросы к временным таблицам и помещать в них индексы. Удивительно быстрее, чем вы ожидаете. : -)

0
ответ дан 14 December 2019 в 01:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: