2013-04-30 14 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 

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

+2

如果他们有一个以上的专业,你想要结果是什么? – Taryn 2013-04-30 12:06:57

+0

我只想得到那位教授的一行我需要唯一的ID – 2013-04-30 12:08:00

+0

所以你只需要选择一个专业? – LuigiEdlCarno 2013-04-30 12:08:53

回答

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

你不解释你的教授有两个专业的专业是什么。
您需要按教授分组,并对专业应用综合功能。根据聚合函数,你会得到不同的结果:

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

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