我在使用此查询返回多个具有相同名称的行的SQL查询时遇到问题:
SELECT * FROM People P JOIN SpecialityCombo C ON P.PERSONID = C.PERSONID JOIN Speciality S ON C.GROUPID = S.ID;
人们包含每个人的信息,专业包含每个专业的名称和ID,SpecialityCombo包含有关人员及其专业之间关联的信息,即每行有一个PERSONID和一个专业ID(试图将其标准化为某些程度)。
我的查询的工作原理是它返回每个Person及其专业名称,但它返回n行以获得他们想要的特殊数量,因为每个专业都返回相同的行“名称”。我想要的是只返回包含每个专业的一行。我怎么能这样做?
答案 0 :(得分:1)
使用左连接来克服未找到特殊情况时返回没有行
SELECT P.*,
GROUP_CONCAT(S.NAME) AS specialties
FROM People P
LEFT JOIN JOIN SpecialityCombo C ON P.PERSONID = C.PERSONID
LEFT JOIN JOIN Speciality S ON C.GROUPID = S.ID
GROUP BY P;
答案 1 :(得分:0)
This article是对连接行值的非常详尽的处理,这是你需要在这里做的事情(将所有专业结果加入到单行和列中,结果类似于“put,chipping,驱动“)。
正如您将看到的,有很多方法可以实现这一目标,具体取决于您对数据的了解和期望(例如,每人的专业数量)。
文章正确地指出,虽然可行,但这对T-SQL来说不是一个合适的任务,更有利的是返回完整的结果集并管理客户端应用程序中的合并和/或格式化。 / p>
答案 2 :(得分:0)
您无法将行转换为列,SQL不支持转动。您最好的选择是连续使用每个专业的结果集,并使用Excel或一些编程来转动。另一种方法是根据您的sql server连接单个列中的所有特性。在mysql中你可以这样做:
SELECT P. *,GROUP_CONCAT(S.NAME SEPARATOR'|')AS专业来自人P加入SpecialityCombo C ON P.PERSONID = C.PERSONID JOIN专业S ON C.GROUPID = S.ID GROUP BY P; < / p>