以下代码部分为几条记录返回多列。
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表中的每一行返回一行。
我认为我的加入是问题,但我没有看到问题。
思考/建议?
谢谢,
查
答案 0 :(得分:0)
JOIN不是问题,它正在做与一对多关系的意义
您可以在查询中使用GROUP BY语句,或者使用子选择从ProgramEnrollments / Program表中返回DISTINCT值。
您似乎没有使用ProgramEnrollments或Program表中的数据,因此在查询中需要它们(我认为它们是,我以为我会问这个问题)。
答案 1 :(得分:0)
您实际上似乎没有使用ProgramEnrollments
或Program
中的任何列,因此请尝试删除这两个列。