2012-04-13 5 views
0

나는 3 개의 관계 .... A, B &에 가입하는 쿼리가 있습니다. 조인은 고유 ID에 있습니다. 표 B는 서로 비슷한 행을 포함하고 있으며 테이블 B의 FK 열에 DISTINCT를 수행하려고합니다 (A의 PK). SQL Server - DISTINCT 한 열에

이 더 명확하게하려면

A    B   C 
---------  --------- --------- 
No. (PK)  Id(PK)  Id (PK) 
Name   Role   Address 
       No.(FK)  No.(FK) 

표 B 내가에서 필드를 끌어 쿼리를 원하는 테이블 A. 사람들의 여러 인스턴스를 가질 수 있습니다, B & C는 번호 필드에 합류했다. 표 B는 번호 열에 대해 동일한 값을 가진 여러 행을 가질 수 있으므로 No. 열에 DISTINCT를 수행하려고합니다.

어떻게하면됩니까?

예 데이터 :

NAME   ROLE  ADDRESS 
--------------------------------------- 
John Smith Manager 1, The Village 
Dawn French Secretary 2, The City 
John Smith SQL Dev 1, The Village 
Terry Tibbs HR Manager 8, The Road 

이것은 관계 (A)에 가입의 일례이며, B & C : 여러 존 스미스 포함될 수

SELECT A.Name, B.Role, C.Address 
FROM A, B, C 
WHERE A.No = B.No AND B.No = C.No 

표 B (동일 인물) 누가 복수의 역할을 가지고 있는가?> 그러므로 나는 한 사람을 유일하게 식별하는 번호에 대해 DISTINCT를하고 싶다. 표 A (No.)의 ePK입니다.

+0

그것은 이것이 SQL 또는 LINQ (-To-SQL) 질문 또는 당신이 무엇을 태그 한 이후의 모든 (그러나 DBMS)인지 분명하지 않다. –

+0

나는 당신이 찾고있는 것이 그룹화하고 있다고 믿는다. –

+3

보유한 데이터와 제외 데이터를 표시 할 수 있습니까? – Arion

답변

0

아니요, 아니요 열에서 그룹화 기준을 사용하여 결과를 요약하려는 것처럼 들립니다. 질문은 번호 값이 같을 때 다른 열의 다른 값으로 무엇을하고 싶습니까?

하나의 해결책이 될 수 있습니다

select a.No, a.Name, 
b.MinRole, b.MaxRole, b.RoleCount, 
c.Address 
from a 
join (
    select b.No, Min(b.Role) as MinRole, Max(b.Role) as MaxRole, 
    Count(distinct b.Role) as RoleCount 
    from b group by b.No 
) as b on a.No = b.No 
join c on a.No = c.No 

이 a.No가와에서 고유 가정하고 한 사람이 여러 역할을 할 수 있습니다 당신의 솔루션에서 1 없음

+0

글쎄요, 사실 그 중요성은 이름 가치와 아니오입니다. 값. .. – user559142

+0

이 쿼리 뒤에 어떤 생각이 있는지 설명해 주시겠습니까 ... – user559142

+0

나는 a와 c 사이에 1 : 1이 있지만 1 a와 b 사이에있을 수 있습니다. 그래서 여러 개의 꿀벌이있을 때 무엇을 보여주고 싶습니까? Sql은 문자열을 role1, role2 등과 같이 agregating하는 것은 좋지 않습니다 ... 그래서 가장 작은 롤, 가장 큰 롤 및 역할 수를 보는 옵션이 있습니다. 이에 근거하여 개정 된 답변을보십시오. – automatic

0

에 1이 C와 여러 주소. "하나의 열 DISTINCT"에는 하위 쿼리 트릭이 필요합니다 (다른 사람들이 이미 보여준 것처럼). 그러나 쿼리가 모든 사람의 기본 (또는 여러 중 하나) 역할과 기본 주소를 표시하는 것이면 쿼리가 훨씬 간단해질 수 있습니다.

SELECT 
A.Name, 
(SELECT TOP 1 Role FROM B WHERE B.No = A.No) AS PrimaryRole, -- you may add ORDER BY here 
(SELECT TOP 1 Address FROM C WHERE C.No = A.No) AS PrimaryAddress, -- add ORDER BY 
FROM A 
ORDER BY A.Name