2014-02-21 14 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

我試着用分號逗號,還是得到這個相同的錯誤... –