2017-09-10 9 views
0

は、私はこれらのテーブルを持っていると言いますpartnerCodeSQL:インナー・ジョインでそれぞれの最初のマッチのみをどうやって取得できますか? |</p> <p><strong>USER</strong></p> <p>のuserId:

パートナー

PARTNERID | readableName | ... |パートナーコード| ...

そして、我々が望む:

select USER.userId, PARTNER.readableName 
from USER 
inner join PARTNER 
on PARTNER.partnerCode = USER.partnerCode 
where USER.userId = <someUser>; 

しかし、各useridには:USERでpartnerCodeペア、partnerCodeことを持っている多くのパートナーエントリが存在することができます。私たちは、join'dテーブルで最初に見つかったPARTNER.readableNameだけを気にします(順序は関係ありません)。

どうすればこのように問い合わせることができますか?どうもありがとう!

+0

USERというuserCode列がありますか? –

+2

使用しているデータベースで質問にタグを付けてください。 –

+0

おっと!はい、それはUSER.partnerCodeを読むべきです:) – user3594939

答えて

0

は、ほとんどのデータベースでは、ANSI標準のウィンドウ機能row_number()を使用してこの操作を行うことができます。

select u.userId, p.readableName 
from USER u inner join 
    (select p.*, 
      row_number() over (partition by p.partnerCode order by p.partnerCode) as seqnum 
     from PARTNER p 
    ) p 
    on p.partnerCode = u.userCode and seqnum = 1 
where u.userId = <someUser>; 

クエリの構造を考えると、多くの場合、相関サブクエリを使用する方が速いだろう:

select u.userId, 
     (select p.readableName 
     from PARTNER p 
     where p.partnerCode = u.userCode 
     fetch first 1 row only -- order doesn't matter, so there is no order by 
    ) as readableName 
from USER u 
where u.userId = <someUser>; 

最適なパフォーマンスを得るには、インデックスをuser(userId)partner(partnerCode, readableName)に設定します。

+0

標準ウィンドウ関数first_value()ではなく、標準ウィンドウ関数row_number()を提案する理由を知りたいですか?この場合は、first_valuesがわかりやすいようです。 – Hogan

+0

@Hogan。 。 。 'row_number()'が最初に気になります。私は 'first_value()'に対して部分的なメンタルブロックを持っています。なぜなら、単に集約関数ではないからです。 –

+0

あなたは私が言うつもりを知っています... row_number()も集計関数ではありません。 :D – Hogan

関連する問題

 関連する問題