我在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
如果教授有两个专业,它将两次返回教授。我怎么能避免这种情况?最好的方法是什么?
答案 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,并使用子查询以逗号获取结果。 与条款或其他想法一起使用。 我希望它能帮助你。 祝你好运。