[SQL] 어떻게 관계를 기반으로 한 레코드에 대해 여러 레코드를 얻으려면?
SQL어떻게 관계를 기반으로 한 레코드에 대해 여러 레코드를 얻으려면?
나는 여러 직원이 할 수있는 많은 관계 즉 하나의 조직에 조직 및 직원이 하나를 가진 두 개의 테이블이있다. 지금은이 조직의 모든 직원의 특정 조직을 더한 이름의 모든 정보를 선택합니다. 그것을 할 수있는 가장 좋은 방법은 무엇입니까? 내가 단일 레코드 세트에이 모든 것을 얻거나 수 난 더를 기반으로하지 않습니다 여러 행을 얻을 수있을 것이다. 직원? 여기에 내가 원하는 걸의 비트 그래픽 데모입니다 :
Org_ID Org_Address Org_OtherDetails Employess
1 132A B Road List of details Emp1, Emp2, Emp3.....
해결법
-
==============================
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.문제는 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.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.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.그것은 모든 따라 달라집니다. 당신이 가입 할 경우 모든 행의 모든 조직 데이터를 얻을. (인당 1 행). 즉 비용이 있습니다. 경우에 당신은 두 개의 쿼리를 수행. 다른 비용이 (조직 및 EMP 다).
그것은 모든 따라 달라집니다. 당신이 가입 할 경우 모든 행의 모든 조직 데이터를 얻을. (인당 1 행). 즉 비용이 있습니다. 경우에 당신은 두 개의 쿼리를 수행. 다른 비용이 (조직 및 EMP 다).
당신의 독을 선택합니다.
-
==============================
6.짧은 대답은 "아니오"입니다.
짧은 대답은 "아니오"입니다.
다른 답변에서 언급 한 바와 같이,이 결과를 달성하기 위해 벤더 고유의 방법이 있습니다 만, 한 쿼리에서 작동 더 순수한 SQL 솔루션은 존재하지 않는다.
미안합니다 :(
아마도 벤더 특정 솔루션 중 하나가 당신을 위해 작동 할 것인가?
-
==============================
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.그들은 매우 잘 수행하고 필요한 경우 (문자열로) 정렬 및 대체 구분이 가능하지만이 프로젝트의 SQL 서버 SQLCLR 집계에 대한 MSDN 코드 샘플에서 영감을하고 있습니다. 그들은 SQL Server에 대한 MySQL의의 GROUP_CONCAT 거의 동일한 기능을 제공합니다.
그들은 매우 잘 수행하고 필요한 경우 (문자열로) 정렬 및 대체 구분이 가능하지만이 프로젝트의 SQL 서버 SQLCLR 집계에 대한 MSDN 코드 샘플에서 영감을하고 있습니다. 그들은 SQL Server에 대한 MySQL의의 GROUP_CONCAT 거의 동일한 기능을 제공합니다.
장점의 전체 비교 / CLR은 집계하고 대한의 XML 솔루션의 단점은 문서에서 찾을 수 있습니다 :
http://groupconcat.codeplex.com
from https://stackoverflow.com/questions/102317/how-to-get-multiple-records-against-one-record-based-on-relation by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] MySQL의 오류 1241 : 피연산자 1 열을 포함해야합니다 (들) (0) | 2020.05.04 |
---|---|
[SQL] 저장 프로 시저에서 MySQL의 동적 쿼리 (0) | 2020.05.04 |
[SQL] SQL에서 대문자로 분할 단어 (0) | 2020.05.04 |
[SQL] 어떻게 총칭 SQL Server 쿼리를 사용하여 정렬 할 수 있나요 A '버전 번호'열 (0) | 2020.05.04 |
[SQL] ㄱ 열 합을 행을 제한하는 MySQL은 소정의 값과 같다 (0) | 2020.05.04 |