我认为答案是使用一个聚合函数来连接组中的行。太糟糕了 TSQL 没有一个(这有多难?),但如果您不介意使用 SQLCLR,这里是如何在 MSDN 中使用 .NET 创建用户定义的聚合连接函数:
MSDN 字符串实用函数示例
<Serializable(), Microsoft.SqlServer.Server.SqlUserDefinedAggregate(Microsoft.SqlServer.Server.Format.UserDefined, IsInvariantToNulls:=True, IsInvariantToDuplicates:=False, IsInvariantToOrder:=False, MaxByteSize:=8000)> _
Public Class Concatenate : Implements Microsoft.SqlServer.Server.IBinarySerialize
Private Builder As StringBuilder
Public Sub Init()
Builder = New StringBuilder
End Sub
Public Sub Accumulate(ByVal value As SqlString)
If value.IsNull Then Return
Builder.Append(",").Append(value.Value)
End Sub
Public Sub Merge(ByVal other As Concatenate)
Builder.Append(other.Builder)
End Sub
Public Function Terminate() As SqlString
If Builder Is Nothing Then Return New SqlString("")
Return New SqlString(Builder.ToString.Substring(1))
End Function
Public Sub Read(ByVal r As BinaryReader) Implements Microsoft.SqlServer.Server.IBinarySerialize.Read
If r Is Nothing Then Throw New ArgumentNullException("r")
Builder = New StringBuilder(r.ReadString())
End Sub
Public Sub Write(ByVal w As BinaryWriter) Implements Microsoft.SqlServer.Server.IBinarySerialize.Write
If w Is Nothing Then Throw New ArgumentNullException("w")
w.Write(Builder.ToString())
End Sub
End Class
然后,您可以执行以下操作:
SELECT PatientCode, Patient, dbo.Concatenate(Doctor), dbo.Concatenate(Nurse)
FROM PatientTable
LEFT JOIN DoctorTable on DoctorTable.DoctorCode = PatientTable.DoctorCode
LEFT JOIN NurseTable on DoctorTable.DoctorCode = NurseTable.DoctorCode
GROUP BY PatientCode, Patient