Лучший способ выполнить динамический подзапрос в MS Reporting Services?
-
09-06-2019 - |
Вопрос
Я новичок в службах отчетов SQL Server, и мне было интересно, как лучше всего сделать следующее:
- Запрос для получения списка популярных идентификаторов
- Подзапрос к каждому элементу для получения свойств из другой таблицы
В идеале итоговые столбцы отчета должны выглядеть следующим образом:
[ID] [property1] [property2] [SELECT COUNT(*)
FROM AnotherTable
WHERE ForeignID=ID]
Могут быть способы создать гигантский SQL-запрос, чтобы сделать все это за один раз, но я бы предпочел разделить его на части.Рекомендуется ли писать функцию VB для выполнения подзапроса для каждой строки?Спасибо за любую помощь.
Решение
Я бы рекомендовал использовать Вложенный отчет.Вы бы поместили вложенный отчет в ячейку таблицы.
Другие советы
В зависимости от того, как вы хотите, чтобы выходные данные выглядели, можно использовать вложенный отчет, или вы могли бы сгруппировать по ID, property1, property2 и показать элементы из вашей другой таблицы в качестве элементов detail (при условии, что вы хотите показать больше, чем просто count).
Что -то вроде
select t1.ID, t1.property1, t1.property2, t2.somecol, t2.someothercol
from table t1 left join anothertable t2 on t1.ID = t2.ID
@Carlton Jenke Я думаю, вы найдете внешнее соединение лучшим исполнителем, чем коррелированный подзапрос в приведенном вами примере.Помните, что подзапрос должен выполняться для каждой строки.
Самый простой метод заключается в следующем:
select *,
(select count(*) from tbl2 t2 where t2.tbl1ID = t1.tbl1ID) as cnt
from tbl1 t1
вот работоспособная версия (с использованием табличных переменных):
declare @tbl1 table
(
tbl1ID int,
prop1 varchar(1),
prop2 varchar(2)
)
declare @tbl2 table
(
tbl2ID int,
tbl1ID int
)
select *,
(select count(*) from @tbl2 t2 where t2.tbl1ID = t1.tbl1ID) as cnt
from @tbl1 t1
Очевидно, что это всего лишь необработанный пример - применяются стандартные правила, такие как не выбирать * и т.д...
ОБНОВЛЕНИЕ от 21 '08 августа в 21:27:
@AlexCuse - Да, полностью согласен с исполнением.
Я начал писать это с помощью внешнего соединения, но затем увидел в его примере вывода количество и подумал, что это то, что он хотел, и количество не вернет корректно, если таблицы будут соединены внешне.Не говоря уже о том, что объединения могут привести к умножению ваших записей (1 запись из tbl1, которая соответствует 2 записям в tbl2 = 2 возврата), что может быть непреднамеренным.
Так что я предполагаю, что это действительно сводится к конкретике того, что должен вернуть ваш запрос.
ОБНОВЛЕНИЕ от 21 '08 августа в 22:07:
Чтобы ответить на другие части вашего вопроса - является ли функция VB правильным решением?Нет.Ни в коем случае.Не для чего-то настолько простого.
Функции очень плохи в производительности, каждая строка в возвращаемом наборе выполняет функцию.
Если вы хотите "разделить" различные части запроса, вы должны подходить к нему скорее как к хранимой процедуре.Создайте временную таблицу, выполните часть запроса и вставьте результаты в таблицу, затем выполните любые дополнительные запросы, которые вам понадобятся, и обновите исходную временную таблицу (или вставьте в другие временные таблицы).