0

クエリを別のビューと組み合わせて単一のクエリ (または spw) にするのに苦労しています。

最初のクエリ:

 SELECT        'Status: ' + Status + CHAR(10) + 'Crew Information:' + CHAR(10) + 'Instructor: ' + IP + CHAR(10) + 'Student: ' + 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: ' + Lesson + CHAR(10) 
                         + CASE WHEN ST.ScheduleRemarks = '' THEN '' ELSE ' REM:' + ST.ScheduleRemarks + Char(10) END + 'Equipment: ' + EquipmentName + ' (' + Callsign + ')' + CHAR(10) + 'Start: ' + CONVERT(VARCHAR(10), 
                         ScheduleTO, 104) + ' - ' + CONVERT(VARCHAR(5), ScheduleTO, 108) + ' UTC' + CHAR(10) + 'Start: ' + CONVERT(VARCHAR(10), ScheduleTD, 104) + ' - ' + CONVERT(VARCHAR(5), ScheduleTD, 108) + ' UTC' + CHAR(10)
                          + CASE WHEN ST.ATC = 'NA' THEN '' ELSE ST.ATC END AS SInfo, IDIP, IDSP, IDA1, 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, dbo.Schedule.ContactIDIP, 
                                                    dbo.Schedule.ContactIDSP, dbo.MasterLesson.Lesson, dbo.Equipment.EquipmentName, dbo.CallSignList.Callsign, dbo.Schedule.Meeting, dbo.Schedule.ScheduleRemarks, 
                                                    dbo.Schedule.StatusRelease, dbo.Schedule.StatusRequest, dbo.Schedule.ScheduleDay, dbo.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, dbo.Schedule.ScheduleTO, dbo.Schedule.ScheduleTD, 
                                                    CASE WHEN Schedule.RouteID = 0 THEN 'NA' ELSE 'Route: ' + Airport.ICAO + ' - ' + Airport1.ICAO + ' - ' + Airport2.ICAO END AS ATC, dbo.ContactList.Id AS IDIP, ContactList1.Id AS IDSP, 
                                                    ContactList2.Id AS IDA1, ContactList3.Id AS IDA2
                          FROM            dbo.Schedule INNER JOIN
                                                    dbo.StudentLesson ON dbo.Schedule.ScheduleLessonID = dbo.StudentLesson.StudentLessonID INNER JOIN
                                                    dbo.MasterLesson ON dbo.StudentLesson.LessonID = dbo.MasterLesson.ID INNER JOIN
                                                    dbo.Equipment ON dbo.Schedule.EquipmentID = dbo.Equipment.ID LEFT OUTER JOIN
                                                    dbo.CallSignList ON dbo.CallSignList.ID = dbo.Schedule.CallSignListID LEFT OUTER JOIN
                                                    dbo.Route ON dbo.Route.ID = dbo.Schedule.RouteID INNER JOIN
                                                    dbo.ContactList ON dbo.ContactList.Id = dbo.Schedule.ContactIDIP INNER JOIN
                                                    dbo.ContactList AS ContactList1 ON ContactList1.Id = dbo.Schedule.ContactIDSP LEFT OUTER JOIN
                                                    dbo.ContactList AS ContactList2 ON dbo.Schedule.ContactIDACM1 = ContactList2.Id LEFT OUTER JOIN
                                                    dbo.ContactList AS ContactList3 ON dbo.Schedule.ContactIDACM2 = ContactList3.Id LEFT OUTER JOIN
                                                    dbo.Airport ON dbo.Route.AirportID_Dep = dbo.Airport.ID LEFT OUTER JOIN
                                                    dbo.Airport AS Airport1 ON dbo.Route.AirportID_Via = Airport1.ID LEFT OUTER JOIN
                                                    dbo.Airport AS Airport2 ON dbo.Route.AirportID_Arr = Airport2.ID
                          WHERE        (dbo.Schedule.StatusRelease = 1) AND (dbo.Schedule.ScheduleDay > GETDATE() - 45) OR
                                                    (dbo.Schedule.ScheduleDay > GETDATE() - 45) AND (dbo.Schedule.StatusRequest = 1)) AS ST

2 番目のクエリ:

SELECT DISTINCT 
    ST.IDIP, 
    substring((Select + CHAR(10) +STn1.SInfo  AS [text()]
              FROM
                  dbo.ST1 STn1
              WHERE
                 STn1.IDIP = ST.IDIP
              ORDER BY 
                 STn1.IDIP
              FOR XML PATH ('')), 2, 1000) [ScheduleInfo]
FROM dbo.ST1 ST

私の問題は、最初のクエリがビューとして保存されることです。したがって、2 番目のクエリは正常に機能します。

しかし、どうすればそれらを単一のクエリにマージできますか? サブクエリとして「STsub」として最初のクエリを選択すると

dbo.ST1 を STsub に置き換えます - 無効なオブジェクトまたはエラーが発生します。

私が間違っていることは何ですか?

4

1 に答える 1

0

一般的なテーブル式を使用してみます。

;WITH STsub as (
   ... First Query ...
)
SELECT DISTINCT 
...
FROM STsub

また、クエリをもう少し最適化して書くこともできます。現在、行ごとに 1 回初期クエリを呼び出す共通の IDIP を使用して、すべての行を自己結合しています。大量のデータを持つことを計画している場合、これはスケーリングしません。

于 2014-01-18T11:39:25.427 に答える