2017-07-13 11 views
0

私は与えられた結果を生成する次のクエリを持っています。SQLクエリ - 条件に基づいて1行またはその他の行を選択してください

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 = 1またはLeadPax = 0の行を選択することです。

これは列に関連する問題の場合、CASEまたはCOALESCEを使用できますが、これを効率的に行えますか?

また、元のクエリを最適化する方法上の任意のポインタは非常

+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 = 1を使用することができます。 – etsa

+0

@etsa - 意味があります。 –

関連する問題