2016-03-30 4 views

ответ

3

Для меня Lookup не выглядит как эквивалент внутреннего соединения, но эквивалент

select 
    CustomerName = (select 
         Customer.Name 
        from 
         Customers 
        where 
         Orders.CustomerId = Customer.Id), 
    Orders.OrderDate 
from 
    Orders 

объединение занимает две таблицы и совпадения строк на обеих таблиц, основанных на некоторых по-п. Тип соединения определяет, что делать с непревзойденными строками с обеих сторон.

Поиск и эквивалент SQL выше, как минимум, концептуально, через одну таблицу и пытается найти для каждой строки соответствующую строку в другой таблице. Результат больше похож на левое соединение, чем на внутреннее соединение, так как в результате остаются непревзойденные строки. Однако существуют различия, так как Lookup ожидает найти одну строку с правой стороны, а соединение расширит набор результатов до всех совпадающих строк с правой стороны. Таким образом, поиск обычно используется для поиска с большой стороны на одну сторону отношения, например, от Приказов к Клиентам выше. Кроме того, объединенные таблицы будут участвовать в агрегатах.

Существует LookupSet function, который будет искать несколько значений, но, в отличие от объединения, он не будет расширять набор результатов, а возвращает массив значений, который будет «вложен» в строку.

Итак, подытоживая, я не думаю, что поиск является эквивалентом внутреннего соединения, и в SSRS не существует эквивалентов для любого другого типа соединения.

Сказав это, вы обычно выполняете объединение в источнике данных своего отчета, считая это источником данных SQL.

+0

Большое спасибо @ r-schreurs –

3

Объяснение от R. Schreurs является правильным, а функции lookup работают как левые соединения, но есть временные решения, которые вы можете использовать, если редактирование источников данных не является вариантом.

Самый простой способ в большинстве случаев для имитации право присоединиться заключается в обратном наборы данных, т.е. использовать DataSet2 как данные вашей таблицы установленные и Lookup значения от DataSet1.

Чтобы смоделировать внутреннее соединение , вы можете использовать lookup, чтобы контролировать, какие строки ваших данных видны. Используя выражение в свойствах строки Видимость, вы можете скрыть строки, где ID не существует в обоих наборах данных:

=IIF(IsNothing(Lookup(Fields!ID_1.Value, Fields!ID_2.Value, Fields!ID_2.Value, "DataSet2")), True, False) 

Для таблицы, которая работает как полное внешнее соединение, я не в курсе решение, которое будет работать без использования третьего набора данных. Если DataSet0 имеет все возможные ID из DataSet1 и DataSet2, вы можете использовать его для значений lookup из обоих наборов данных. Затем вы можете использовать аналогичное выражение для приведенного выше, чтобы скрыть строки, где идентификатор не найден ни в DataSet1, ни в DataSet2.

+0

большое спасибо @ pete-rennard-cumming –

Смежные вопросы