1. ホーム
  2. sql-server

[解決済み] 左結合のトップ1

2022-11-11 06:08:12

質問

以下のクエリを考えると、dps_markersに同じマーカー・キーを持つ複数の行があるかもしれませんが、最初の行に対してのみ結合したいのです。 このクエリから上位1行を削除してORDER BYすると、mbg.marker_valueの値が得られますが、そのまま実行すると、常にnullが返されます。

SELECT u.id, mbg.marker_value 
FROM dps_user u
LEFT JOIN 
    (SELECT TOP 1 m.marker_value, um.profile_id
     FROM dps_usr_markers um (NOLOCK)
         INNER JOIN dps_markers m (NOLOCK) 
             ON m.marker_id= um.marker_id AND 
                m.marker_key = 'moneyBackGuaranteeLength'
     ORDER BY m.creation_date
    ) MBG ON MBG.profile_id=u.id 
WHERE u.id = 'u162231993'

どのように解決するのですか?

LEFT JOINの代わりにOUTER APPLYを使用します。

SELECT u.id, mbg.marker_value 
FROM dps_user u
OUTER APPLY 
    (SELECT TOP 1 m.marker_value, um.profile_id
     FROM dps_usr_markers um (NOLOCK)
         INNER JOIN dps_markers m (NOLOCK) 
             ON m.marker_id= um.marker_id AND 
                m.marker_key = 'moneyBackGuaranteeLength'
     WHERE um.profile_id=u.id 
     ORDER BY m.creation_date
    ) AS MBG
WHERE u.id = 'u162231993';

JOINとは異なり、APPLYでは内側のクエリ内でu.idを参照することができます。