2017-07-13 94 views
0

我有以下查詢生成給定的結果。SQL查詢 - 根據條件選擇一行或另一行

SELECT 
    p.BookingID, p.PaxID, p.LeadPax, p.FirstName AS LeadPaxName 
FROM 
    [dbo].[BookingV2_Pax] p 
WHERE 
    p.[LeadPax] = 1 

UNION 

SELECT 
    PN.BookingID, PN.PaxID, PN.LeadPax, PN.LeadPaxName 
FROM 
    (SELECT 
     p.BookingID, p.PaxID, p.LeadPax, p.FirstName AS LeadPaxName, 
     ROW_NUMBER() OVER (PARTITION BY p.BookingID ORDER BY p.PaxID) AS rn 
    FROM 
     [dbo].[BookingV2_Pax] p 
    WHERE 
     p.[LeadPax] = 0) PN 
WHERE 
    PN.rn = 1 

結果:

booking pax results

什麼我在這裏做的是選擇具有LeadPax = true該行並從具有LeadPax = false

其他行選擇的第一行我想要的是選擇LeadPax = 1LeadPax = 0的行。

據我所知,如果這是一個列相關的問題,我可以使用CASECOALESCE,但我如何有效地做到這一點?

此外,在如何優化原始查詢任何指針將高度讚賞

+1

轉到** CodeReview **,另一個** SE **站點。 –

回答

2

這裏有一種方法

只有當LeadPax = False生成的行號。然後使用AND/OR邏輯來獲取相關數據

SELECT PN.BookingID, 
     PN.PaxID, 
     PN.LeadPax, 
     PN.LeadPaxName 
FROM (SELECT p.BookingID, 
       p.PaxID, 
       p.LeadPax, 
       p.FirstName AS LeadPaxName, 
       case when PN.[LeadPax] = 0 then Row_number() OVER (partition BY p.BookingID ORDER BY p.PaxID) 
       else 1 end AS rn 
     FROM [dbo].[BookingV2_Pax] p) PN 
WHERE (PN.rn = 1 AND PN.[LeadPax] = 0) 
     OR PN.[LeadPax] = 1 
+1

如果LeadPax只有0和1的值,您可以在CASE中編寫ELSE 1並僅使用WHERE rn = 1 – etsa

+0

@etsa - 具有意義..已更新 –

相關問題