145

SQLに少しこだわっています。質問をうまく表現できないと思いますので、お見せしましょう。

私には2つのテーブルがあります。1つはpersonと呼ばれ、もう1つはappointmentと呼ばれます。私は人が持っている予定の数を返そうとしています(彼らがゼロを持っているかどうかを含む)。アポイントメントにはが含まれ、アポイントメントごとperson_idにあります。賢明なアプローチもperson_idそうです。COUNT(person_id)

クエリ:

SELECT person_id, COUNT(person_id) AS "number_of_appointments" 
FROM appointment 
GROUP BY person_id;

正しく返されます、person_idが持っている予定の数。ただし、予定が0の人は返されません(明らかに、そのテーブルに含まれていないため)。

個人テーブルからperson_idを取得するようにステートメントを微調整すると、次のようになります。

SELECT person.person_id, COUNT(appointment.person_id) AS "number_of_appointments"
FROM appointment
JOIN person ON person.person_id = appointment.person_id
GROUP BY person.person_id;

ただし、これでも、予定があるperson_idのみが返され、予定が0の人との返送である私が望むものは返されません。

何か提案はありますか?

4

6 に答える 6

119

このための外部結合が必要です(そして、人を「駆動」テーブルとして使用する必要があります)

SELECT person.person_id, COUNT(appointment.person_id) AS "number_of_appointments"
FROM person 
  LEFT JOIN appointment ON person.person_id = appointment.person_id
GROUP BY person.person_id;

これが機能している理由はNULL、予定がない人のために外側(左)の結合が戻るためです。集計関数count()は値をカウントしないNULLため、ゼロになります。

外部結合について詳しく知りたい場合は、次のチュートリアルをご覧ください:http ://sqlzoo.net/wiki/Using_Null

于 2013-02-10T00:04:21.857 に答える
23

LEFT JOIN代わりに使用する必要がありますINNER JOIN

SELECT person.person_id, COUNT(appointment.person_id) AS "number_of_appointments"
FROM person 
LEFT JOIN appointment ON person.person_id = appointment.person_id
GROUP BY person.person_id;
于 2013-02-10T00:03:44.603 に答える
7

(カウントを使用して)外部結合を実行し、この結果をサブテーブルとして使用すると、期待どおりに0を取得できます(nvl関数のおかげで)

元:

select P.person_id, nvl(A.nb_apptmts, 0) from 
(SELECT person.person_id
FROM person) P
LEFT JOIN 
(select person_id, count(*) as nb_apptmts
from appointment 
group by person_id) A
ON P.person_id = A.person_id
于 2016-01-20T13:30:11.080 に答える
5

joinを使用して、GROUPBYを使用した結果で0カウントを取得します。

単に「結合」はMSSQLで内部結合を行うので、左結合または右結合に進みます。

主キーを含むテーブルがQUERYで最初に言及されている場合は、LEFT結合を使用します。それ以外の場合はRIGHT結合を使用します。

例えば:

select WARDNO,count(WARDCODE) from MAIPADH 
right join  MSWARDH on MSWARDH.WARDNO= MAIPADH.WARDCODE
group by WARDNO

select WARDNO,count(WARDCODE) from MSWARDH
left join  MAIPADH on MSWARDH.WARDNO= MAIPADH.WARDCODE group by WARDNO

主キーを持つテーブルからgroupbyを取得し、実際のエントリ/詳細を持つ別のテーブルからカウントします。

于 2017-11-09T10:55:52.813 に答える
4

元のクエリの変更をさらに少なくするために、結合を結合に変えることができRIGHTます

SELECT person.person_id, COUNT(appointment.person_id) AS "number_of_appointments"
FROM appointment
RIGHT JOIN person ON person.person_id = appointment.person_id
GROUP BY person.person_id;

これは選択した答えに基づいていますが、外側の結合がRIGHT方向にあるため、追加する必要があるのは1つの単語だけで、変更は少なくなります。-そこにあり、クエリを読みやすくし、再構築の必要性を減らすことができることを覚えておいてください。

于 2018-06-28T12:21:24.663 に答える
3

LEFT JOINの問題は、予定がない場合でもnullを含む1行を返すことです。これは、COUNTで集計すると1になり、実際には予定がないのに1つの予定があるように見えます。これで正しい結果が得られると思います。

SELECT person.person_id,
(SELECT COUNT(*) FROM appointment WHERE person.person_id = appointment.person_id) AS 'Appointments'
FROM person;
于 2019-10-10T02:19:09.697 に答える