2017-10-05 2 views
3

各IDが特定の表に何回出現するかを次のように数えようとしています。カウントを使用すると、0が存在するはずのタプルが1として出力されますか?

Members 
ID | NAME 
1 | Bob 
2 | John 
3 | Sally 
4 | Hannah 

Department 
ID | DEPT 
1 | Math 
1 | English 
3 | Math 
4 | Math 
4 | English 
4 | Science 

私は次のようにテーブルを表示したいと思います:私はこの私の最も最近の一つであるにいくつかの試みがなされてきた

ID | Name | Count(Dept) 
1 | Bob | 2 
2 | John | 0 
3 | Sally | 1 
4 | Hannah | 3 

select owner 
from table 
where (select count(distinct letter) from table group by owner) in 
(select max(count(distinct letter)) from table group by owner); 

私はどのように見えることはできません0の結果が正しく表示されるようにします。正直なところ、私は基本的に自然な結合をしたくないときに、使い方についてちょっと混乱しています。

編集:私が質問しようとしていることを正しく示すために質問を編集しました。混乱を招いて申し訳ありません。

+0

'自然join'を使用しないでください。それは、宣言された外部キー制約ではなく、同じ名前を持つ列を使用します。 –

+0

@GordonLinoff代わりに何を使用すべきですか?私は自然結合がやや疑わしいと知っていましたが、そうでなければ私の質問を得ることができませんでした。 –

+0

。 。 'ON'または' USING'です。 –

答えて

2

テーブルを結合するとき、WHICH TABLEを参照することは非常に重要です。全体のSQLを短縮するのを助けるために、テーブル全体の名前の代わりに "テーブルエイリアス"を定義して使用することができます。

select m.id, m.name, count(d.id) as count_d 
from members m 
left outer join department d on m.id = d.id 
group by m.id, m.name 
; 

上記で私はLEFT OUTER JOINを使用しました。その外部結合が定義されると、の行がmembesrの行と一致しない行が存在する可能性があります。したがって、その行のdepartmentに関連するすべての列でNULLが取得されます。

NULLカウント値がになるたびに、COUNT()関数が1ずつ増加するため、かっこ内に含める項目が重要です。 COUNT(*)は何があっても各行ごとに増加します。 COUNT(d.id)は、その列で一部の行がNULLである可能性があるため、ゼロを与えることがあります。

このSQL Fiddle

Resultsを参照してください。

| ID | NAME | COUNT_D | 
|----|--------|---------| 
| 1 | Bob |  2 | 
| 2 | John |  0 | 
| 3 | Sally |  1 | 
| 4 | Hannah |  3 | 
+0

かなり不十分な質問に答えることを試みていただきありがとうございます。私は、私が求めていたことを正しく示すために質問を編集しました。 –

+0

と私は私の答えを編集しましたが、これはほとんど同じですが、推測を削除しました。 –

+0

aha!それでおしまい。ありがとうございました! –

関連する問題