如何简化以下内部加入SQL查询

发布于 2025-02-05 01:39:57 字数 1970 浏览 2 评论 0原文

我从不同的表中获取记录,并串联这样的值,以便我可以显示Flight1,Flief2,Flight3和Flight4 ......作为列。 由于我使用相同的条件,是否有任何方法可以简化此查询?

SELECT b.BookingID

,(SELECT TOP 1 CONCAT(il.CCode,il.FlightNumber,';',dc.[Name])
        FROM ILeg il
        INNER JOIN PLeg pjl ON pjl.InventoryLegID = il.InventoryLegID
             INNER JOIN PSegment pjs ON pjs.SegmentID = pjl.SegmentID
             INNER JOIN BPassenger bp ON bp.PassengerID = pjs.PassengerID
             INNER JOIN City dc ON dc.CityCode = il.DepartureStation
             INNER JOIN City ac ON ac.CityCode = il.ArrivalStation
             WHERE bp.BookingID =  b.BookingID AND il.CarrierCode = '12T'
             ORDER BY il.STD
             ) AS Flight1

,(SELECT CONCAT((il.CCode,il.FlightNumber,';',dc.[Name]))
        FROM ILeg il
        INNER JOIN PLeg pjl ON pjl.InventoryLegID = il.InventoryLegID
             INNER JOIN PSegment pjs ON pjs.SegmentID = pjl.SegmentID
             INNER JOIN BPassenger bp ON bp.PassengerID = pjs.PassengerID
             INNER JOIN City dc ON dc.CityCode = il.DepartureStation
             INNER JOIN City ac ON ac.CityCode = il.ArrivalStation
             WHERE bp.BookingID =  b.BookingID AND il.CarrierCode = '12T'
             ORDER BY il.STD
             OFFSET 1 ROWS
        FETCH NEXT 1 ROWS ONLY) AS Flight2

,(SELECT CONCAT((il.CCode,il.FlightNumber,';',dc.[Name]))
        FROM ILeg il
        INNER JOIN PLeg pjl ON pjl.InventoryLegID = il.InventoryLegID
             INNER JOIN PSegment pjs ON pjs.SegmentID = pjl.SegmentID
             INNER JOIN BPassenger bp ON bp.PassengerID = pjs.PassengerID
             INNER JOIN City dc ON dc.CityCode = il.DepartureStation
             INNER JOIN City ac ON ac.CityCode = il.ArrivalStation
             WHERE bp.BookingID =  b.BookingID AND il.CarrierCode = '12T'
             ORDER BY il.STD
             OFFSET 2 ROWS
        FETCH NEXT 1 ROWS ONLY) AS Flight3

FROM Booking b
WHERE b.RecordLocator='1234'

谢谢

I am getting records from different tables and concatenating the values like this so that I can display Flight1, Flight2, Flight3, and Flight4...... as columns.
Since I am using the same conditions, Is there any way to simplify this query?

SELECT b.BookingID

,(SELECT TOP 1 CONCAT(il.CCode,il.FlightNumber,';',dc.[Name])
        FROM ILeg il
        INNER JOIN PLeg pjl ON pjl.InventoryLegID = il.InventoryLegID
             INNER JOIN PSegment pjs ON pjs.SegmentID = pjl.SegmentID
             INNER JOIN BPassenger bp ON bp.PassengerID = pjs.PassengerID
             INNER JOIN City dc ON dc.CityCode = il.DepartureStation
             INNER JOIN City ac ON ac.CityCode = il.ArrivalStation
             WHERE bp.BookingID =  b.BookingID AND il.CarrierCode = '12T'
             ORDER BY il.STD
             ) AS Flight1

,(SELECT CONCAT((il.CCode,il.FlightNumber,';',dc.[Name]))
        FROM ILeg il
        INNER JOIN PLeg pjl ON pjl.InventoryLegID = il.InventoryLegID
             INNER JOIN PSegment pjs ON pjs.SegmentID = pjl.SegmentID
             INNER JOIN BPassenger bp ON bp.PassengerID = pjs.PassengerID
             INNER JOIN City dc ON dc.CityCode = il.DepartureStation
             INNER JOIN City ac ON ac.CityCode = il.ArrivalStation
             WHERE bp.BookingID =  b.BookingID AND il.CarrierCode = '12T'
             ORDER BY il.STD
             OFFSET 1 ROWS
        FETCH NEXT 1 ROWS ONLY) AS Flight2

,(SELECT CONCAT((il.CCode,il.FlightNumber,';',dc.[Name]))
        FROM ILeg il
        INNER JOIN PLeg pjl ON pjl.InventoryLegID = il.InventoryLegID
             INNER JOIN PSegment pjs ON pjs.SegmentID = pjl.SegmentID
             INNER JOIN BPassenger bp ON bp.PassengerID = pjs.PassengerID
             INNER JOIN City dc ON dc.CityCode = il.DepartureStation
             INNER JOIN City ac ON ac.CityCode = il.ArrivalStation
             WHERE bp.BookingID =  b.BookingID AND il.CarrierCode = '12T'
             ORDER BY il.STD
             OFFSET 2 ROWS
        FETCH NEXT 1 ROWS ONLY) AS Flight3

FROM Booking b
WHERE b.RecordLocator='1234'

Thank you

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

深海少女心 2025-02-12 01:39:57

您可以在顶部使用CTE,主查询可能会如下。

;with CTE as 
(SELECT CONCAT((il.CCode,il.FlightNumber,';',dc.[Name])) as DisplayName
        FROM ILeg il
        INNER JOIN PLeg pjl ON pjl.InventoryLegID = il.InventoryLegID
             INNER JOIN PSegment pjs ON pjs.SegmentID = pjl.SegmentID
             INNER JOIN BPassenger bp ON bp.PassengerID = pjs.PassengerID
             INNER JOIN City dc ON dc.CityCode = il.DepartureStation
             INNER JOIN City ac ON ac.CityCode = il.ArrivalStation
             WHERE bp.BookingID =  b.BookingID AND il.CarrierCode = '12T'
             ORDER BY il.STD),
SELECT b.BookingID
,(SELECT TOP 1 * from CTE) AS Flight1
,(SELECT TOP 1 * from CTE OFFSET 1 ROWS FETCH NEXT 1 ROWS ONLY) AS Flight2
,(SELECT TOP 1 * from CTE OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY) AS Flight3
FROM Booking b
WHERE b.RecordLocator='1234'

You can use a CTE on top and the main query might look as below.

;with CTE as 
(SELECT CONCAT((il.CCode,il.FlightNumber,';',dc.[Name])) as DisplayName
        FROM ILeg il
        INNER JOIN PLeg pjl ON pjl.InventoryLegID = il.InventoryLegID
             INNER JOIN PSegment pjs ON pjs.SegmentID = pjl.SegmentID
             INNER JOIN BPassenger bp ON bp.PassengerID = pjs.PassengerID
             INNER JOIN City dc ON dc.CityCode = il.DepartureStation
             INNER JOIN City ac ON ac.CityCode = il.ArrivalStation
             WHERE bp.BookingID =  b.BookingID AND il.CarrierCode = '12T'
             ORDER BY il.STD),
SELECT b.BookingID
,(SELECT TOP 1 * from CTE) AS Flight1
,(SELECT TOP 1 * from CTE OFFSET 1 ROWS FETCH NEXT 1 ROWS ONLY) AS Flight2
,(SELECT TOP 1 * from CTE OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY) AS Flight3
FROM Booking b
WHERE b.RecordLocator='1234'
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文