Postgres での 2 つのテーブルの処理: メンバーとメンバーシップ。メンバーシップには、メンバーシップがまだ実行されている場合は NULL になる end_date 列があります。終了するか、終了日が判明すると (将来の可能性があります)、フィールドに日付が入力されます。
ここで、現時点でアクティブなメンバーシップを持たないすべてのメンバーを検索したいと考えています (または、end_dates が設定されていて、過去またはメンバーシップが 0 のメンバーシップのみ)。メンバーは明らかに複数のメンバーシップを持つことができます。
私は Rails (3.2) プロジェクトでこれを行っており、可能であれば ActiveRecord を使用できるようにしたいと考えていますが、必要に応じてストレート SQL で十分です (ただし、ActiveRecord はよく知っています)。
サブクエリであらゆる種類のものを見つけようとしましたが、関連するテーブルの特定の行の数が 0 である行を選択する方法が見つかりません。
私はかなり長い間グーグルで検索してきましたが、検索方法についてのアイデアが不足しています。ほとんどの回答は、基準に一致するレコードを見つけることを扱っており、一致しないレコードは望んでいないと感じています。多分それは初心者の質問か、私が間違ってターゲットにしています。その場合:教えてください、私はちょっと始めたばかりです。
Jakub による部分的な回答に基づいて、さらに多くのことを試しました。現時点では、次のクエリがあります。
選択する m.id、m.first_name、m.last_name、COUNT (ms.id) AS n_memberships から メンバー AS m LEFT JOIN メンバーシップ AS ミリ秒 ON m.id = ms.member_id GROUP BY m.id、ms.end_date HAVING (max(ms.end_date) < now() AND NOT COUNT(ms.end_date = NULL) > 0) OR COUNT(ms.id) = 0;
これにより、メンバーシップをまったく持たない (過去も現在も持たない) すべてのメンバーが返されます。HAVING 句の最後の部分 (OR ... 部分) に基づきます。ただし、メンバーシップが期限切れで現在のメンバーシップがないメンバーも返されることを期待しています。これは、 max(ms.end_date) が現在よりも小さい値を返し、特定の終了日のないメンバーシップがないためです。これは起こりませんが、何かアイデアはありますか?