0

我正在 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

如果 Prof 有两个 Specialities,它会返回该 Prof 两次。我怎样才能避免这种情况?最好的方法是什么?

4

3 回答 3

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子句显式编写连接,而不是隐式编写。

于 2013-04-30T12:10:23.720 回答
1

如果您只想返回一个专业,那么您可以使用聚合 (max/min) 函数:

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 子句中的连接的逗号分隔列表。

于 2013-04-30T12:09:46.207 回答
1

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

于 2013-04-30T12:11:05.870 回答