これには分析クエリを使用できます。
select *
from (
select p.*, v.*,
row_number() over (partition by p.id order by v.userid) as rn
from prmprofile p
join user v on v.profile = p.id
where p.language = 0
and v.userid like '%TEST%'
)
where rn = 1;
内部クエリはすべてのデータを取得し (ただし、使用*
は理想的ではありません)、各値に行番号シーケンスを割り当てる追加の列を追加しp.id
ます。それらは何かによって順序付けられる必要があり、特定の行が「最初」になる理由は言われていないので、ユーザーIDとして推測しました-もちろん、それをより適切なものに変更できます。これにより、クエリが再実行されます。( 「最初の」行を選択するための代替方法については、rank
およびを参照してください)。dense_rank
外側のクエリは、結果セットを追加の列に値があるものに制限するだけで、1
すべての に対して 1 つの行が得られますp.id
。
別のアプローチは、サブクエリを使用して「最初の」行を識別し、それに結合することですが、基準が何であるか、およびそれが十分に選択的であるかどうかは明確ではありません。