2008-11-12 4 views
3

이 테이블이 있다고 가정 해 보겠습니다.중첩 쿼리가없는 SQL 쿼리

테이블 사용자 :
- ID
- username을
- 이메일

테이블 user2group :
- 사용자 ID
- 그룹 ID

테이블 그룹 :
- ID
- 그룹 이름

어떻게 모든 사용자를 반환 한 쿼리를 만들 수 있죠, 그리고 그룹은 그들에 속한다 (결과 집합 또는 무언가의 배열로 ..)

답변

7
select u.id, u.username, u.email, g.groupid, g.groupname 
from user u 
join user2group ug on u.userid=ug.userid 
join group g on g.groupid=ug.groupid 
order by u.userid 

당신이 결과 집합 통해 반복되기 때문에, 당신이 볼 때마다 새로운 사용자 ID는 새로운 사용자 객체 (또는 무엇이든)를 만들고 그것에 그룹을 추가합니다.

3

에릭의 대답은 훌륭하지만, 어떤 그룹에도 속하지 않은 사용자를 얻으려면 INNER 대신 LEFT JOIN을 사용합니다.

SELECT 
    u.id, 
    u.username, 
    u.email, 
    g.groupid, 
    g.groupname 
FROM 
    user u 
    LEFT JOIN user2group ug ON u.userid = ug.userid 
    LEFT JOIN group g ON g.groupid = ug.groupid 
ORDER BY 
    u.userid 
0

위의 두 가지 모두 어느 정도 정확합니다 (각 사용자가 그룹을 갖고 있는지 여부에 관계없이). 그러나 그들은 또한 각 사용자에 대해 여러 항목이 포함 된 결과 세트를 제공합니다.

하나의 쉼표로 구분 된 문자열로 모든 그룹 구성원을 연결하는 방법이있다, 당신이 여기에 대해 읽어 좋을 것 : 제가 개인적으로 좋아하는 또 다른 방법은 관계형 테이블 user2group 대신 비트 값을 사용하는 것입니다 http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/

테이블 사용자는 int (또는 bigint) 필드 그룹을 가져오고 각 그룹 ID에는 하나의 비트 값이 할당됩니다 (예 : 1,2,4,8,16 등). 사용자 테이블의 그룹 필드 값 그런 다음 할당 된 groupID의 합계입니다. 그룹에 그룹이 있는지 조회하려면 여기서 (그룹 AND 그룹 ID = 그룹 ID)