복붙노트

[SQL] 어떻게 관계를 기반으로 한 레코드에 대해 여러 레코드를 얻으려면?

SQL

어떻게 관계를 기반으로 한 레코드에 대해 여러 레코드를 얻으려면?

나는 여러 직원이 할 수있는 많은 관계 즉 하나의 조직에 조직 및 직원이 하나를 가진 두 개의 테이블이있다. 지금은이 조직의 모든 직원의 특정 조직을 더한 이름의 모든 정보를 선택합니다. 그것을 할 수있는 가장 좋은 방법은 무엇입니까? 내가 단일 레코드 세트에이 모든 것을 얻거나 수 난 더를 기반으로하지 않습니다 여러 행을 얻을 수있을 것이다. 직원? 여기에 내가 원하는 걸의 비트 그래픽 데모입니다 :

Org_ID      Org_Address    Org_OtherDetails    Employess

1           132A B Road    List of details     Emp1, Emp2, Emp3.....

해결법

  1. ==============================

    1.원래 질문은 데이터베이스의 특정했지만, 아마도이 더 일반적인 대답을 포함 할 수있는 좋은 장소입니다. 그것은 일반적인 질문입니다. 당신이 설명되는 개념은 종종 '그룹 병합'이라고합니다. SQL-92 또는 SQL-99 표준 용액은 더 없다. 그래서 당신은 공급 업체 특정 솔루션이 필요합니다.

    원래 질문은 데이터베이스의 특정했지만, 아마도이 더 일반적인 대답을 포함 할 수있는 좋은 장소입니다. 그것은 일반적인 질문입니다. 당신이 설명되는 개념은 종종 '그룹 병합'이라고합니다. SQL-92 또는 SQL-99 표준 용액은 더 없다. 그래서 당신은 공급 업체 특정 솔루션이 필요합니다.

    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
    
    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은 당신이 AGGREGATE를 작성하여 자신의 집계 함수를 정의 할 수 있습니다. 약간 더 MySQL의 이상 작동하지만 훨씬 더 유연. 자세한 내용은이 다른 게시물을 참조하십시오. (물론 PostgreSQL의 9.0 이후는 물론이 옵션이 있습니다.)

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

    2.문제는 MySQL을로 태그되어 있기 때문에, 당신은 MySQL의 특정 솔루션, 즉, GROUP_CONCAT을 사용할 수 있어야합니다. 예를 들어,

    문제는 MySQL을로 태그되어 있기 때문에, 당신은 MySQL의 특정 솔루션, 즉, GROUP_CONCAT을 사용할 수 있어야합니다. 예를 들어,

    select Org_ID, Org_Address, Org_OtherDetails,
           GROUP_CONCAT(employees) as Employees
    from  employees a, organization b
    where a.org_id=b.org_id
    group by b.org_id;
    
  3. ==============================

    3.MS SQL에서 당신이 할 수 있습니다 :

    MS SQL에서 당신이 할 수 있습니다 :

    create function dbo.table2list (@input int)
    returns varchar(8000)
    as
    BEGIN
    declare @putout varchar(8000)
    set @putout = ''
    select @putout = @putout + ', ' + <employeename>
    from <employeetable>
    where <orgid> = @input
    return @putout
    end
    

    다음을 수행하십시오

    select * from org, dbo.table2list(orgid)
    from <organisationtable>
    

    난 당신이 아니라 COALESCE ()와 함께 할 수 있다고 생각하지만, 내 머리 위로 떨어져 구문을 기억할 수없는

  4. ==============================

    4.Oracle을 사용하는 경우 당신은 당신이 입력으로 ORGANIZATION_ID을 받아 쿼리에서 사용할 수있는 PL / SQL 함수를 작성하고 문자열로 그 조직에 속한 모든 직원의 이름을 반환 할 수 있습니다. 예를 들면 : -

    Oracle을 사용하는 경우 당신은 당신이 입력으로 ORGANIZATION_ID을 받아 쿼리에서 사용할 수있는 PL / SQL 함수를 작성하고 문자열로 그 조직에 속한 모든 직원의 이름을 반환 할 수 있습니다. 예를 들면 : -

    select
       o.org_id,
       o.org_address,
       o.org_otherdetails,
       org_employees( o.org_id ) as org_employees
    from
       organization o
    
  5. ==============================

    5.그것은 모든 따라 달라집니다. 당신이 가입 할 경우 모든 행의 모든 ​​조직 데이터를 얻을. (인당 1 행). 즉 비용이 있습니다. 경우에 당신은 두 개의 쿼리를 수행. 다른 비용이 (조직 및 EMP 다).

    그것은 모든 따라 달라집니다. 당신이 가입 할 경우 모든 행의 모든 ​​조직 데이터를 얻을. (인당 1 행). 즉 비용이 있습니다. 경우에 당신은 두 개의 쿼리를 수행. 다른 비용이 (조직 및 EMP 다).

    당신의 독을 선택합니다.

  6. ==============================

    6.짧은 대답은 "아니오"입니다.

    짧은 대답은 "아니오"입니다.

    다른 답변에서 언급 한 바와 같이,이 결과를 달성하기 위해 벤더 고유의 방법이 있습니다 만, 한 쿼리에서 작동 더 순수한 SQL 솔루션은 존재하지 않는다.

    미안합니다 :(

    아마도 벤더 특정 솔루션 중 하나가 당신을 위해 작동 할 것인가?

  7. ==============================

    7.여기에 당신이 무엇을 할 수 있는지, 당신은 두 가지 옵션이 있습니다 :

    여기에 당신이 무엇을 할 수 있는지, 당신은 두 가지 옵션이 있습니다 :

    select *
    FROM
      users u
      LEFT JOIN organizations o ON (u.idorg = o.id);
    

    당신이 정말로 필요하지 않은 전체 조직 정보 -이 방법은 각 행에 추가 데이터를 얻을 것이다.

    또는 당신은 할 수 있습니다 :

    select o.*, group_concat(u.name)
    FROM
      users u
      LEFT JOIN organizations o ON (u.idorg = o.id)
    GROUP BY
      o.id
    

    http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

    당신은 예를보고 싶다면 두 번째 방법을 적용한다. 사용자 이름 "사용자 1, 사용자 2, 사용자 3"하지만, 목록 필드 자체에서 작동하지 않으려는 ...

  8. ==============================

    8.그들은 매우 잘 수행하고 필요한 경우 (문자열로) 정렬 및 대체 구분이 가능하지만이 프로젝트의 SQL 서버 SQLCLR 집계에 대한 MSDN 코드 샘플에서 영감을하고 있습니다. 그들은 SQL Server에 대한 MySQL의의 GROUP_CONCAT 거의 동일한 기능을 제공합니다.

    그들은 매우 잘 수행하고 필요한 경우 (문자열로) 정렬 및 대체 구분이 가능하지만이 프로젝트의 SQL 서버 SQLCLR 집계에 대한 MSDN 코드 샘플에서 영감을하고 있습니다. 그들은 SQL Server에 대한 MySQL의의 GROUP_CONCAT 거의 동일한 기능을 제공합니다.

    장점의 전체 비교 / CLR은 집계하고 대한의 XML 솔루션의 단점은 문서에서 찾을 수 있습니다 :

    http://groupconcat.codeplex.com

  9. from https://stackoverflow.com/questions/102317/how-to-get-multiple-records-against-one-record-based-on-relation by cc-by-sa and MIT license