我需要从SQL Server数据库表中构建一些XML。
我需要吐出这个XML结构:
<shifts>
<day workDate='2014-11-11'>
<shift startdate='2014-11-11 10:19' enddate='2014-11-11 13:00'>
<shift startdate='2014-11-11 14:00' enddate='2014-11-11 16:00'>
</day>
<day workDate='2014-11-12'>
<shift startdate='2014-11-12 10:19' enddate='2014-11-12 13:00'>
<shift startdate='2014-11-12 14:00' enddate='2014-11-12 16:00'>
</day>
</shifts>
我的问题是我的XML数据是重复的。这似乎是因为每个日期有2条记录,我最终得到:
<shifts>
<day workDate='2014-11-11'>
<shift startdate='2014-11-11 10:19' enddate='2014-11-11 13:00'>
<shift startdate='2014-11-11 14:00' enddate='2014-11-11 16:00'>
</day>
<day workDate='2014-11-11'>
<shift startdate='2014-11-11 10:19' enddate='2014-11-11 13:00'>
<shift startdate='2014-11-11 14:00' enddate='2014-11-11 16:00'>
</day>
<day workDate='2014-11-12'>
<shift startdate='2014-11-12 10:19' enddate='2014-11-12 13:00'>
<shift startdate='2014-11-12 14:00' enddate='2014-11-12 16:00'>
</day>
<day workDate='2014-11-12'>
<shift startdate='2014-11-12 10:19' enddate='2014-11-12 13:00'>
<shift startdate='2014-11-12 14:00' enddate='2014-11-12 16:00'>
</day>
</shifts>
如果我可以投入“SELECT DISTINCT”,那将是非常好的,但是SQL服务器会抱怨它,因为它无法进行比较。
The xml data type cannot be selected as DISTINCT because it is not comparable.
这是SQL语句的一部分。为了简洁起见,我试图将其中的大部分内容剪掉,但它“应该”有意义。
SELECT dbo.udf_DATEVALUE(err2.ShiftStartDT) [@workDate]
,
(
SELECT err3.Shift [@Shift],
err3.Campus [@Campus],
CASE WHEN murs3.AssistantNum = 0 THEN 1 ELSE 0 END [@isSIC],
err3.ShiftStartDT [@startdate],
err3.ShiftFinishDT [@enddate]
FROM ExamRoomRoster err3
INNER JOIN MU_Roster_Supervisor murs3 ON murs3.ExamRoomRosterID = err3.ExamRoomRosterID
INNER JOIN ExamSupervisor es3 ON es3.ExamSupervisorID = murs3.ExamSupervisorID
WHERE err3.ExamSessionID = 104
AND es3.ExamSupervisorID = 1297
AND dbo.udf_DATEVALUE(err3.ShiftStartDT) = dbo.udf_DATEVALUE(err2.ShiftStartDT)
ORDER BY err3.Shift
FOR XML PATH ('Shift'), type
)
FROM ExamRoomRoster err2
ORDER BY dbo.udf_DATEVALUE(err2.ShiftStartDT)
FOR XML PATH ('Day'), type
基本上,ExamRoomRoster表中有多个rose,每个班次有1个,包含开始日期/时间和结束日期/时间值。
我真的很想坚持DISTINCT,然后我觉得它没问题。
SELECT DISTINCT dbo.udf_DATEVALUE(err2.ShiftStartDT) [@workDate]
...
FOR XML PATH ('Day'), type
有没有其他方法可以在没有DISTINCT的情况下执行此操作?
由于
答案 0 :(得分:0)
执行此操作的一种方法是使用CTE或子查询
WITH CTE
AS
( -- your current query
)
SELECT distinct col1, col2 ...
FROM
CTE
答案 1 :(得分:0)
试试这个。将结果保存在子查询中,并在外部查询中使用distinct。在子查询中删除顺序并将其保留在外部查询
中select Distinct * from (
SELECT dbo.udf_DATEVALUE(err2.ShiftStartDT) [@workDate]
...
FOR XML PATH ('Day'), type) A
ORDER BY A.[@workDate]