2016-12-02 12 views
0

この質問は一例なしで説明するのは難しいです。1対多のリレーションシップに対する単一のSQL SELECTクエリ

私は2つのテーブル、企業従業員を持って、彼らは1対多の関係を持って、1社は、多くの従業員が参加することができます。

最も簡単なテーブル構造がここ

Company 
| id | name | 

Employee 
| id | name | company_id | join_date | 

示されている今の質問は次のとおりです。

私は最初の2人の従業員を選択して、会社のテーブルに列としての参加日付を示すことができる方法は?

だから、結果はemployeeテーブルの外部キー列company_idがあると仮定すると、この

| id | company_name | first_employee_join_at | second_employee_join_at | 
+1

*最初の2人の*従業員はどういう意味ですか? –

+0

「最初の2人の従業員」とは、最初に会社に入社した人たちです。列定義を提供できますか? – actc

+0

会社と従業員はどのようにリンクしていますか?どこかに 'company_id'がありますか? –

答えて

2

次のようになります。

with emps as (
    select id, name, company_id, 
     row_number() over (partition by company_id order by join_date) as rn 
    from employee 
) 
select c.id, c.name as company_name, 
     e1.join_date as first_employee_join_at, 
     e2.join_date as second_employee_join_at 
from company c 
    left join emps e1 on e1.company_id = c.id and e1.rn = 1 
    left join emps e2 on e2.company_id = c.id and e2.rn = 2; 

これはしかしひどく効率的であることを行っていません。少し効率的なバージョンは条件付き集計を使用します:

with emps as (
    select id, name, company_id, 
     row_number() over (partition by company_id order by join_date) as rn 
    from employee 
) 
select c.id, c.name as company_name, 
     max(e.join_date) filter (where rn = 1) as first_employee_join_at, 
     max(e.join_date) filter (where rn = 2) as second_employee_join_at 
from company c 
    join emps e on e.company_id = c.id and e.rn in (1,2) 
group by c.id, c.name; 
関連する問題