метод Простейшая заключается в следующем:
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
Очевидно, что это просто сырым пример - стандартные правила, как не выбрать * и т.д ...
UPDATE от 21 августа '08 в 21:27:
@AlexCuse - Да, полностью согласен с исполнением.
Я начал писать его с внешним соединением, но затем увидел в своем примере вывод графа и подумал, что это то, что он хотел, и граф не вернется правильно, если таблицы будут соединены наружу. Не говоря уже о том, что объединения могут привести к умножению ваших записей (1 запись из tbl1, которая соответствует 2 записям в tbl2 = 2 возвращается), которые могут быть непреднамеренными.
Таким образом, я думаю, что это действительно сводится к специфике того, что должен вернуть ваш запрос.
UPDATE от 21 августа '08 в 22:07:
Чтобы ответить на другие части вашего вопроса - это функция VB путь? Нет. Абсолютно нет. Не для чего-то такого простого.
Функции очень плохие по производительности, каждая строка в наборе возврата выполняет эту функцию.
Если вы хотите «разделить» различные части запроса, вам нужно приблизиться к нему как к хранимой процедуре. Создайте временную таблицу, выполните часть запроса и вставьте результаты в таблицу, затем выполните любые дополнительные запросы и обновите исходную таблицу temp (или вставьте в более временные таблицы).