2014-02-21 15 views
0

我有一个查询 - 它将Union列表中的5列合并为2列。 所以基本上 - 一个ID +一些信息。由于身份证可能在第2-5列 - 有几次......我重新安排在一个ID列+文本中。不能在查询中放入第二个“with”语句

现在 - 我想使用第二个“with”语句 - 将多行的ID与XML路径结合使用。但在这里我陷入了困境。

这是代码 - 这给了我两列 - 内容与预期:

With 
STall as (Select 
    'Status: ' + ST.Status + Char(10) + 'Crew Information:' + Char(10) + 
    'Instructor: ' + ST.IP + Char(10) + 'Student: ' + ST.SP + Char(10) + Case 
     When ST.ACM1 = 'NA' Then '' Else 'ACM1: ' + ST.ACM1 + Char(10) End + Case 
     When ST.ACM2 = 'NA' Then '' Else 'ACM2: ' + ST.ACM2 + Char(10) 
    End + 'Lesson: ' + ST.Lesson + Char(10) + Case 
     When ST.ScheduleRemarks = '' Then '' 
     Else ' REM:' + ST.ScheduleRemarks + Char(10) 
    End + 'Equipment: ' + ST.EquipmentName + ' (' + ST.Callsign + ')' + 
    Char(10) + 'Start: ' + Convert(VARCHAR(10),ST.ScheduleTO,104) + ' - ' + 
    Convert(VARCHAR(5),ST.ScheduleTO,108) + ' UTC' + Char(10) + 'End: ' + 
    Convert(VARCHAR(10),ST.ScheduleTD,104) + ' - ' + 
    Convert(VARCHAR(5),ST.ScheduleTD,108) + ' UTC' + Char(10) + Case 
     When ST.ATC = 'NA' Then '' Else ST.ATC End As SInfo, 
    ST.IDIP, 
    ST.IDSP, 
    ST.IDA1, 
    ST.IDA2 
    From 
    (Select 
     Case When Schedule.StatusRelease = 1 Then 'OK' Else Case 
      When Schedule.StatusRequest = 1 Then 'STBY' Else 'N/A' End 
     End As Status, 
     Schedule.ContactIDIP, 
     Schedule.ContactIDSP, 
     MasterLesson.Lesson, 
     Equipment.EquipmentName, 
     CallSignList.Callsign, 
     Schedule.Meeting, 
     Schedule.ScheduleRemarks, 
     Schedule.StatusRelease, 
     Schedule.StatusRequest, 
     Schedule.ScheduleDay, 
     ContactList.FullNameTLC As IP, 
     ContactList1.FullNameTLC As SP, 
     Case When Schedule.ContactIDACM1 = 0 Then 'NA' 
     Else ContactList2.FullNameTLC End As ACM1, 
     Case When Schedule.ContactIDACM2 = 0 Then 'NA' 
     Else ContactList3.FullNameTLC End As ACM2, 
     Schedule.ScheduleTO, 
     Schedule.ScheduleTD, 
     Case When Schedule.RouteID = 0 Then 'NA' 
     Else 'Route: ' + Airport.ICAO + ' - ' + Case 
      When IsNull(Airport1.ICAO, 'NA') = 'NA' Then ' ' 
      Else Airport1.ICAO + ' - ' End + Airport2.ICAO + Char(10) + Char(13) 
     End As ATC, 
     ContactList.Id As IDIP, 
     ContactList1.Id As IDSP, 
     ContactList2.Id As IDA1, 
     ContactList3.Id As IDA2 
    From 
     Schedule Inner Join 
     StudentLesson On Schedule.ScheduleLessonID = StudentLesson.StudentLessonID 
     Inner Join 
     MasterLesson On StudentLesson.LessonID = MasterLesson.ID Inner Join 
     Equipment On Schedule.EquipmentID = Equipment.ID Left Join 
     CallSignList On CallSignList.ID = Schedule.CallSignListID Left Join 
     Route On Route.ID = Schedule.RouteID Inner Join 
     ContactList On ContactList.Id = Schedule.ContactIDIP Inner Join 
     ContactList ContactList1 On ContactList1.Id = Schedule.ContactIDSP 
     Left Join 
     ContactList ContactList2 On Schedule.ContactIDACM1 = ContactList2.Id 
     Left Join 
     ContactList ContactList3 On Schedule.ContactIDACM2 = ContactList3.Id 
     Left Join 
     Airport On Route.AirportID_Dep = Airport.ID Left Join 
     Airport Airport1 On Route.AirportID_Via = Airport1.ID Left Join 
     Airport Airport2 On Route.AirportID_Arr = Airport2.ID 
    Where 
     ((Schedule.StatusRelease = 1) Or 
     (Schedule.StatusRequest = 1)) And 
     Schedule.ScheduleDay = '21.02.2014') As ST) 

Select Distinct 
    STall.IDIP,SInfo 
From 
    STall 
where STall.IDIP > 0 

UNION 
Select Distinct 
    STall.IDSP,SInfo 
From 
    STall 
where STall.IDSP > 0 
UNION 
    Select Distinct 
    STall.IDA1,SInfo 
From 
    STall 
where STall.IDA1 > 0 
UNION 
Select Distinct 
    STall.IDA2,SInfo 
From 
    STall 
    where STall.IDA2 > 0 

现在 - 我尝试添加另一个With STtotal as (的开始...... 和

) 
Select Distinct 
    STsub.IDIP, 
    SubString((Select 
    +Char(10) + STn1.SInfo As [text()] 
    From 
    STsub STn1 
    Where 
    STn1.IDIP = STtotal.IDIP 
    Order By 
    STn1.IDIP 
    For Xml Path('')), 2, 1000) ScheduleInfo 
From 
    STtotal 

但是我收到一个错误 - 在“with”有错误的语句。

也许还有另一种方法 - 如何合并 - “信息文本”列与所有ID - 可能在第2-5列。

感谢您的任何输入

+1

你认为可以包含一个最小的测试用例吗?你的代码对我来说看起来相当大;-) –

+0

你想在一个查询中做两个单独的查询或使用两个CTE吗? – zimdanen

回答

0

用逗号分隔您的CTE; WITH只需要指定一次:

;WITH CTE1 AS (
    ... 
), CTE2 AS (
    ... 
) 
SELECT ... 
+0

好吧......我不会“联合”CTE--我想用第一个作为子查询......这将为我提供两列 - 而不是按ID结合所有内容。 –

+0

我提供的语法是指定多个CTE以便在单个查询中使用。 CTE之间没有固有的关系。 – zimdanen

0

您是否记得在第一个语句的末尾放置一个分号?

+0

我试着用分号逗号,还是得到这个相同的错误... –