由于连接,sql select返回重复的行

时间:2013-04-30 12:06:00

标签: sql sql-server select join

我在select语句中进行连接,并且由于连接而返回重复的专业ID。

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

如果教授有两个专业,它将两次返回教授。我怎么能避免这种情况?最好的方法是什么?

3 个答案:

答案 0 :(得分:2)

你没有解释你的教授有两个专业所需的专业 您需要按教授分组,并对专业应用聚合函数。根据聚合函数,您将得到不同的结果:

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

使用MAX功能,您将获得专业的最大值,以字符串为单位。

请注意,您应该使用JOIN子句显式编写联接,而不是隐式编写。

答案 1 :(得分:1)

如果您只想返回一个专业,那么您可以使用聚合(最大/最小)功能:

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;

或者,由于您使用的是SQL Server,因此您还可以使用row_number()函数为每位专业人员返回一行:

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;

注意:我将查询更改为使用ANSI JOIN语法(INNER JOIN)而不是逗号分隔列表与WHERE子句中的连接。

答案 2 :(得分:1)

从连接中删除S,并使用子查询以逗号获取结果。 与条款或其他想法一起使用。 我希望它能帮助你。 祝你好运。