web-dev-qa-db-ja.com

カウント0を持つグループでクエリ

私は宿題としてフットボールリーグを管理するためのアプリケーションに取り組んでいます。プレイヤーがリーグでプレイした試合数でフィルターリストを表示したい。たとえば、ユーザーはcount> 0とcount <5を入力できます。

Countがゼロより大きい場合に正常に機能するクエリを作成しました。ただし、一部のケースでは、ユーザーはまだどの試合にも参加していないプレーヤーを含めたい場合があります。例えば:

SELECT p.PLAYER_ID, p.NAME, p.SURNAME, p.POSITION, p.TEAM_ID, p.DRESS_NUM FROM player p 
 LEFT JOIN player_in_squad psq ON p.PLAYER_ID = psq.PLAYER_ID 
 LEFT JOIN squad sq ON sq.SQUAD_ID = psq.SQUAD_ID
 LEFT JOIN squad_match sqm ON sqm.SQUAD_ID = psq.SQUAD_ID 
 LEFT JOIN match m ON m.MATCH_ID = sqm.MATCH_ID
     WHERE sqm.HOME = 'N' 
     AND m.LEAGUE_YEAR = 1
     AND m.LEAGUE_TYPE_ID = 301
    GROUP BY p.PLAYER_ID,  p.NAME, p.SURNAME, p.POSITION, p.TEAM_ID, p.DRESS_NUM
    HAVING COUNT(*) < 2;

このクエリでは、count> 0のみが返されます。したがって、ユーザーがフィルター済みリストにcount = 0を含めるかどうかを検出する手動条件を作成し、これをクエリの先頭に追加します。

SELECT p.PLAYER_ID, p.NAME, p.SURNAME, p.POSITION, p.TEAM_ID, p.DRESS_NUM FROM player p INTERSECT

...しかし、私はこの回避策のソリューションが好きではありません。私の先生もそうではないと思います。

もっと良いアプローチがあるに違いないと思います。何か案は?あなたの

2
user2275785

HAVING句は、データに存在する行のみを除外できます。この場合、count(*)= 0を取得できるのは、一致する行がないことだけです。つまり、最初から何も返されません。

おそらく左結合で既存の一致をカウントしたいので、COUNT(m.MATCH_ID)は、match_idがnullでない行のみをカウントします。

編集:もう1つ気づいたこと-左結合テーブルに接触するWHEREに多くの条件があります-これは実際には左結合の効果をキャンセルします。つまり、一致する行が存在しない場合、「m.LEAGUE_YEAR = 1」はfalseになるためです。 league_yearがnull-各テーブル(mとsqmの場合)の「join-cond AND additionalCont1 AND ...」として条件をONに移動したい場合-それらのプレーヤーの一部を実際に提供する機会を得ますマッチなし。

2
jkavalik