我有以下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 & "' )
答案 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。