首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SQL Server上的FOR XML查询中选择distinct日期部分

在SQL Server上的FOR XML查询中选择distinct日期部分
EN

Stack Overflow用户
提问于 2014-11-11 07:34:02
回答 2查看 161关注 0票数 0

我需要从SQL Server数据库表构建一些XML。

我需要输出这个XML结构:

代码语言:javascript
复制
<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条记录,所以我最终得到:

代码语言:javascript
复制
<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 server抱怨说,因为它不能被比较。

代码语言:javascript
复制
The xml data type cannot be selected as DISTINCT because it is not comparable.

以下是SQL语句的一部分。为了简洁,我试着删掉了大部分内容,但它“应该”是有意义的。

代码语言:javascript
复制
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,每个班次对应一个rose,具有开始日期/时间和结束日期/时间值。

我真的很想坚持在一个不同的,然后我认为它会很好。

代码语言:javascript
复制
SELECT DISTINCT dbo.udf_DATEVALUE(err2.ShiftStartDT) [@workDate]
...
FOR XML PATH ('Day'), type

是否有其他方法可以在不使用DISTINCT的情况下完成此操作?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2014-11-11 08:28:53

一种方法是使用CTE或子查询

代码语言:javascript
复制
WITH CTE 
AS
( -- your current query
)
SELECT distinct col1, col2 ... 
FROM
CTE
票数 0
EN

Stack Overflow用户

发布于 2014-11-11 08:56:46

尝试对子查询中的结果使用this..Keep,在外部查询中使用distinct。删除子查询内的order by,并将其保留在外部查询中

代码语言:javascript
复制
select Distinct * from (
SELECT  dbo.udf_DATEVALUE(err2.ShiftStartDT) [@workDate]
...
FOR XML PATH ('Day'), type) A
ORDER BY A.[@workDate]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26854989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档