sql >> データベース >  >> RDS >> Mysql

関係に基づいて1つのレコードに対して複数のレコードを取得するにはどうすればよいですか?

    元の質問はデータベース固有でしたが、おそらくこれはより一般的な回答を含めるのに適した場所です。よくある質問です。あなたが説明している概念は、しばしば「グループ連結」と呼ばれます。 SQL-92またはSQL-99には標準的なソリューションはありません。したがって、ベンダー固有のソリューションが必要になります。

    • MySQL -組み込みのGROUP_CONCAT関数を使用します。あなたの例では、次のようなものが必要になります:
    select 
      o.ID, o.Address, o.OtherDetails,
      GROUP_CONCAT( concat(e.firstname, ' ', e.lastname) ) as Employees
    from 
      employees e 
      inner join organization o on o.org_id=e.org_id
    group by o.org_id
    
    • PostgreSQL --string_agg(expression、delimiter)が組み込まれているため、PostgreSQL9.0も同様にシンプルです。ここでは、要素間に「コンマスペース」があります:
    select 
      o.ID, o.Address, o.OtherDetails,
      STRING_AGG( (e.firstname || ' ' || e.lastname), ', ' ) as Employees
    from 
      employees e 
      inner join organization o on o.org_id=e.org_id
    group by o.org_id
    

    9.0より前のPostgreSQLでは、CREATEAGGREGATEを使用して独自の集計関数を定義できます。 MySQLよりも少し多くの作業がありますが、はるかに柔軟性があります。これを参照してくださいその他の投稿 詳細については。 (もちろん、PostgreSQL 9.0以降にもこのオプションがあります。)

    • オラクル - LISTAGGを使用した同じアイデア 。

    • MS SQL Server - STRING_AGGを使用した同じアイデア

    • フォールバックソリューション -他のデータベーステクノロジまたは上記のテクノロジの非常に古いバージョンでは、これらのグループ連結機能はありません。その場合、org_idを入力として受け取り、連結された従業員名を出力するストアドプロシージャを作成します。次に、このストアドプロシージャをクエリで使用します。ここでの他の応答のいくつかには、これらのようなストアドプロシージャを作成する方法に関する詳細が含まれています。

    select 
      o.ID, o.Address, o.OtherDetails,
      MY_CUSTOM_GROUP_CONCAT_PROCEDURE( o.ID ) as Employees
    from 
      organization o
    


    1. MySQLでのビューの更新

    2. IntegrityErrorの原因となる行を無視するDjangobulk_create?

    3. mysqlmax_allowed_pa​​cketが自動的に1mにリセットされる理由

    4. MySQLの日時フィールドと夏時間-余分な時間をどのように参照しますか?