7

私は2つのテーブル間で結合を行っており、結合条件と「extern」条件も満たす最初の行のみを取得する条件を追加しています。

たとえば、このクエリは次のとおりです。

select * from PRMPROFILE p, user v
where 
p.id = v.profile
and p.language = 0
and v.userid like '%TEST%';

まず、プロファイル (v.profile または p.id) を使用して、この内部結合の結果をグループ化する方法を知りたいです。あとはグループごとに初登場だけ見せる方法。

前もって感謝します。

4

5 に答える 5

12

これには分析クエリを使用できます。

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

別のアプローチは、サブクエリを使用して「最初の」行を識別し、それに結合することですが、基準が何であるか、およびそれが十分に選択的であるかどうかは明確ではありません。

于 2013-04-16T10:32:30.333 に答える
3

してみてください:

select * from(
  select *, 
    row_number() over (partition by v.userid order by v.userid) RNum
  from PRMPROFILE p, user v
  where 
  p.id = v.profile
  and p.language = 0
  and v.userid like '%TEST%'
  )x 
where RNum=1;
于 2013-04-16T10:12:48.873 に答える
0

上位の結果のみを表示します

select top 1 * from PRMPROFILE p, user v
where 
    p.id = v.profile
    and p.language = 0
    and v.userid like '%TEST%';
于 2013-04-16T10:10:05.550 に答える