2013-04-30 5 views
0

select 문에서 조인을 수행 중이며 조인 때문에 중복 된 전문가 ID를 반환합니다.sql select가 조인 때문에 중복 행을 반환합니다.

Select P.ProfessionalID, P.ProfessionalName , S.SpecialtyName 
    from Professionals P, ProfessionalSpecialtyRelation PR, Specialties S 
where 
    (P.ProfessionalName Like '%arif%' OR P.ProfessionalSurname Like '%%' 
    ) 
    And P.ProfessionalID = PR.ProfessionalID 
    AND P.ProfessionalID = POR.ProfessionalID 
    AND PR.SpecialtyID = S.SpecialtyID 

Prof가 두 개의 Specialties를 가지고있는 경우 Prof를 두 번 반환합니다. 어떻게 피할 수 있습니까? 가장 좋은 방법은 무엇입니까?

+2

둘 이상의 전문 분야가있는 경우 결과를 원하십니까? – Taryn

+0

그 교수에게 단 하나의 행만 가져오고 싶습니다. 유일한 ID가 필요합니다 –

+0

하나의 명물 만 선택하면됩니까? – LuigiEdlCarno

답변

1

만 다음 집계 (최대/최소) 기능을 사용할 수있는 하나 개의 전문을 반환 할 경우 SQL Server를 사용하고 있기 때문에 당신은 또한 하나를 반환 할 row_number() 기능을 사용할 수 있습니다 또는

Select P.ProfessionalID, 
    P.ProfessionalName, 
    max(S.SpecialtyName) SpecialtyName 
from Professionals P 
inner join ProfessionalSpecialtyRelation PR 
    on P.ProfessionalID = PR.ProfessionalID 
    -- and P.ProfessionalID = POR.ProfessionalID You are not joining to a table with POR alias 
inner join Specialties S 
    on PR.SpecialtyID = S.SpecialtyID 
where P.ProfessionalName Like '%arif%' 
    OR P.ProfessionalSurname Like '%%' 
group by P.ProfessionalID, P.ProfessionalName; 

을 각 직업에 대한 행 :

select ProfessionalID, 
    ProfessionalName, 
    SpecialtyName 
from 
(
    Select P.ProfessionalID, 
    P.ProfessionalName, 
    S.SpecialtyName, 
    row_number() over(partition by P.ProfessionalID order by S.SpecialtyName) rn 
    from Professionals P 
    inner join ProfessionalSpecialtyRelation PR 
    on P.ProfessionalID = PR.ProfessionalID 
    -- and P.ProfessionalID = POR.ProfessionalID You are not joining to a table with POR alias 
    inner join Specialties S 
    on PR.SpecialtyID = S.SpecialtyID 
    where P.ProfessionalName Like '%arif%' 
    OR P.ProfessionalSurname Like '%%' 
) d 
where rn = 1; 

참고 :이 WHERE 절에 조인과 내가 (내부 조인) 대신 쉼표로 구분 된 목록을 ANSI 사용하는 구문을 가입 할 수있는 쿼리를 변경했습니다.

2

당신은 두 가지 전문 분야를 가진 당신의 교수가 원하는 전문 분야에 대해 설명하지 않습니다.
교수별로 그룹화하고 전문 분야에 집계 함수를 적용해야합니다. 집계 함수에 따라 다른 결과를 얻을 것이다 다음 MAX 기능으로

SELECT P.ProfessionalID 
    , P.ProfessionalName 
    , MAX(S.SpecialtyName) 
FROM Professionals P 
    INNER JOIN ProfessionalSpecialtyRelation PR 
     ON P.ProfessionalID = PR.ProfessionalID 
      INNER JOIN Specialties S 
       ON PR.SpecialtyID = S.SpecialtyID 
WHERE P.ProfessionalName Like '%arif%' 
OR P.ProfessionalSurname Like '%%' 
GROUP BY P.ProfessionalID, P.ProfessionalName 

, 당신은 문자열의 관점에서, 전문의 상한값을 얻을 것이다.

암시 적으로 쓰는 대신 조인을 명시 적으로 JOIN 절로 작성해야합니다.

1

S를 조인에서 제거하고 하위 쿼리를 사용하여 결과를 쉼표로 가져옵니다. 절 또는 다른 아이디어와 함께 사용하십시오. 잘 도와 주길 바랍니다. 행운을 빈다.

관련 문제