最も簡単な方法は次のとおりです。
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
明らかに、これは生の例にすぎません - * を選択しないなどの標準的なルールが適用されます ...
2008 年 8 月 21 日 21:27 からの更新:
@AlexCuse - はい、パフォーマンスに完全に同意します。
私は外部結合でそれを書き始めましたが、彼のサンプル出力でカウントを見て、それが彼が望んでいたものだと思いました.テーブルが外部結合されている場合、カウントは正しく返されません. 言うまでもなく、結合によってレコードが乗算され (tbl2 の 2 つのエントリに一致する tbl1 からの 1 つのエントリ = 2 が返される)、これは意図しない可能性があります。
したがって、クエリが何を返す必要があるかについての詳細に要約すると思います。
2008 年 8 月 21 日 22:07 からの更新:
質問の他の部分に答えるには、VB 関数を使用する方法はありますか? いいえ、絶対に違います。この単純なものではありません。
関数はパフォーマンスが非常に悪く、戻りセットの各行が関数を実行します。
クエリのさまざまな部分を「区分化」したい場合は、ストアド プロシージャのようにアプローチする必要があります。一時テーブルを作成し、クエリの一部を実行して結果をテーブルに挿入してから、さらに必要なクエリを実行して元の一時テーブルを更新します (または他の一時テーブルに挿入します)。