Visit
tmstamp, trackno, qno, service
01/01/2011,1, 01, Sv1
01/01/2011,2, 03, Sv1
01/01/2011,3, 04, Sv2
01/01/2011,4, 06, Sv2
01/02/2011,1, 01, Sv1
Matter
tmstamp, trackno, code
01/01/2011,1, a
01/01/2011,1, b
01/01/2011,1, e
01/01/2011,2, c
01/01/2011,2, b
01/01/2011,3, c
01/01/2011,3, a
01/01/2011,4, d
01/01/2011,4, c
01/02/2011,1, a
01/02/2011,1, b
select service, count(qno) as 'qno_served' from visit group by service
service, qno_served
SV1, 3
SV2, 2
私の現在の声明は、それぞれservice
のためにどれくらい多くのqno
を持っていますか?メインテーブルがSQLのtbl1である間にtbl2からの行を無視するには?
matter
テーブルにリンクするように私の声明をひねりたいです。 qno
にcode
"a"が含まれているかどうかを確認します。
qno
がcode
"A" を持っている場合は、私がでカウントする必要はありません。
だから、私の最終的な結果は、このリンケbのだろう。
service, qno_served
SV1, 1
SV2, 1
これを取得するには、私はjoinメソッドまたはwhtメソッドを使用しますか?
それは効率的ではないでしょう。訪問テーブルの行ごとにWHERE句でクエリを実行しますようにこれが見えます。 – tponthieux
@tponthieux http://sqlinthewild.co.za/index.php/2010/03/23/left-outer-join-vs-not-exists/ –
リンク@Martinが指摘したように、それは必ずしも必要ではない本当。これは、アンチ・セミ・ジョインのための非常に一般的な構成であり、SQL Serverはそれを処理するのに熟練しています。ハッシュ・マージ・ジョイン・イテレーター(ネストされたループだけでなく)を使用することもできます。どちらも、内部表を2回以上反復する必要はありません。セミ・ジョイン(where句のEXISTS)やselect句の相関サブクエリなど、他の相関サブクエリも同様です。 –