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