T-SQL返回重复的行

时间:2010-06-11 14:59:16

标签: tsql

以下代码部分为几条记录返回多列。

SELECT a.ClientID,ltrim(rtrim(c.FirstName)) + ' ' +

case when c.MiddleName <> '' then
ltrim(rtrim(c.MiddleName)) + '. ' 
else '' 
end +

ltrim(rtrim(c.LastName)) as ClientName, a.MISCode, b.Address, b.City, dbo.ClientGetEnrolledPrograms(CONVERT(int,a.ClientID)) as Abbreviation
FROM ClientDetail a
JOIN Address b on(a.PersonID = b.PersonID)
JOIN Person c on(a.PersonID = c.PersonID)
LEFT JOIN ProgramEnrollments d on(d.ClientID = a.ClientID and d.Status = 'Enrolled' and d.HistoricalPKID is null)
LEFT JOIN Program e on(d.ProgramID = e.ProgramID and e.HistoricalPKID is null)
WHERE a.MichiganWorksData=1

case when c.MiddleName <> '' then ltrim(rtrim(c.MiddleName)) + '. ' else '' end + ltrim(rtrim(c.LastName)) as ClientName, a.MISCode, b.Address, b.City, dbo.ClientGetEnrolledPrograms(CONVERT(int,a.ClientID)) as Abbreviation FROM ClientDetail a JOIN Address b on(a.PersonID = b.PersonID) JOIN Person c on(a.PersonID = c.PersonID) LEFT JOIN ProgramEnrollments d on(d.ClientID = a.ClientID and d.Status = 'Enrolled' and d.HistoricalPKID is null) LEFT JOIN Program e on(d.ProgramID = e.ProgramID and e.HistoricalPKID is null) WHERE a.MichiganWorksData=1

我已将问题隔离到ProgramEnrollments表。 此表包含一对多关系,其中每个ClientID都可以在许多程序中注册。因此,对于每个注册客户的程序,表中都有一条记录。

因此,最终结果集将根据这些连接为ProgramEnrollments表中的每一行返回一行。

我认为我的加入是问题,但我没有看到问题。

思考/建议?

谢谢,

2 个答案:

答案 0 :(得分:0)

JOIN不是问题,它正在做与一对多关系的意义

您可以在查询中使用GROUP BY语句,或者使用子选择从ProgramEnrollments / Program表中返回DISTINCT值。

您似乎没有使用ProgramEnrollments或Program表中的数据,因此在查询中需要它们(我认为它们是,我以为我会问这个问题)。

答案 1 :(得分:0)

您实际上似乎没有使用ProgramEnrollmentsProgram中的任何列,因此请尝试删除这两个列。