试图在一行上获得多个相关值

时间:2016-08-25 22:17:56

标签: sql

我有以下sql select语句,它返回我想要的信息。虽然我有很多左连接,但是tryomg可以为学生和任何其他相关数据提供数据,但它似乎可靠地工作。我似乎偶然发现的唯一问题是返回国籍数据。如果学生有一个国籍,我的查询很好,但是如果他们有两个国籍,我想在同一行的第一个末尾添加/追加第二个值。有人告诉我实现这个目标的最佳方法吗?这种情况下我会使用子查询

SELECT p.pk_PupilID,p.PupilNumber,p.PupilStatus,pn.Surname ,pn. Forename,p.Form,d.DepartmentCode,p.BoardingStatus,e.StartTerm,e.StartAcademicYear,ny.Form,ny.BoardingStatus, c.Nationality 
FROM Pupil p
LEFT JOIN Person pn ON p.pk_PupilID = pn.pk_PersonID 
LEFT JOIN NextAcademicYear ny ON p.pk_PupilID = ny.fk_PupilID 
LEFT JOIN Department d ON p.fk_DepartmentID=d.pk_DepartmentID 
LEFT JOIN Enrolment e ON p.pk_PupilID=e.fk_PupilID 
LEFT JOIN Nationality n ON p.pk_PupilID = n.fk_PersonID 
LEFT JOIN Country c ON n.fk_ISO2Code = c.ISO2Code 
WHERE p.pk_PupilID IN( '" & $IDs & "' )

4 个答案:

答案 0 :(得分:1)

您获得的结果与sql的工作方式一致。

我通常会为你要做的事情做的是制作一些其他代码,比如将多个国籍组合到一个字段中的函数。例如,如果他们返回两行,您的查询“USA”在另一个“Japan”中。在我的例子中,他们将在一行数据中将“USA,Japan”列入一列国籍。也许“美国,日本,英国”,如果他们有三个国籍,但这个过程有限制只会帮助你,如果有少数像4或更少。

请注意,不要使用此类查询进入笛卡尔连接状态。如果他们可以有两个部门,或者你链接到的任何其他东西中的两个部分都处于笛卡尔加入状态,这个解决方案将不起作用。

答案 1 :(得分:1)

这是正常的预期行为。旧学校对此的回答是“在你的申请中处理它。”

对于大多数现代RDBMS,您可以使用字符串聚合函数。

MySQL有GROUP_CONCAT()。

Oracle有LISTAGG()。

PostgreSQL有STRING_AGG()。

SQL Server有一种荒谬的神秘STUFF() FOR XML PATH ('')语法,让你的眼睛流血,但确实有效。

答案 2 :(得分:0)

对于SQL Server,使用以下脚本来实现所需的结果。

SELECT p.pk_PupilID,p.PupilNumber,p.PupilStatus,pn.Surname ,pn. Forename,p.Form,d.DepartmentCode,p.BoardingStatus,e.StartTerm,e.StartAcademicYear,ny.Form,ny.BoardingStatus
  , stuff((SELECT distinct ', ' + ISNULL(c.Nationality,'')
       FROM  Nationality n 
            JOIN Country c ON n.fk_ISO2Code = c.ISO2Code  
       where  p.pk_PupilID = n.fk_PersonID AND c.Nationality IS NOT null
       FOR XML PATH('')),1,1,'') Nationality 
FROM Pupil p
LEFT JOIN Person pn ON p.pk_PupilID = pn.pk_PersonID 
LEFT JOIN NextAcademicYear ny ON p.pk_PupilID = ny.fk_PupilID 
LEFT JOIN Department d ON p.fk_DepartmentID=d.pk_DepartmentID 
LEFT JOIN Enrolment e ON p.pk_PupilID=e.fk_PupilID 
WHERE p.pk_PupilID IN( '" & $IDs & "' )

答案 3 :(得分:0)

要考虑的事情。您寻求的并不完全遵循所有Sql平台或所有Sql版本支持的主流SQL。 " Stuff"许多较新的sql版本都提供了命令或变体。我认为MsSql支持表示支持它与版本2008.一个函数将适用于所有Sql平台,但它需要更多的工作,并且更具有平台和版本。如果您是在Sql 2005和Sql 2008上工作,并且您使用了stuff命令。我相信它不适用于Sql 2005.只是想帮助你做出明智的决定。这就是说你的函数的语法是特定于平台的。您可以编写一个可以执行此操作的函数,并一直工作回MsSql 2000,如果这是您正在处理的。但它不适用于Pgsql,MySql,Oracle,Db2,MariaDb等。它可能适用于Sybase。