2016-03-25 11 views
0

ページあたり100人のメンバーを表示する必要があります。メンバーの複数の電話番号のため、各メンバーの最初の電話番号を選択する必要があります。ここで最初の電話番号の行を取得する

は、1つのメンバーのすべての電話番号を取得するクエリです:

SELECT * FROM 
    (  
      SELECT 
      row_number() over(order by(1)) rn, 
      NAME, PHONE  
       FROM MEMBERS t0  
       LEFT OUTER JOIN MEMBER_IDENTITY ON MEMBER_IDENTITY.ID=t0.ID 
       LEFT JOIN MEMBER_PHONE ON MEMBER_PHONE.MEMBER_ID=t0.ID  
       WHERE 
      NAME LIKE 'U%' 
      ORDER BY NAME ASC 
    )  
WHERE rn >= 0 
AND rn <= 100 

は、どのように私は最初-or MAX、etc-電話番号選ぶことができますか?

+0

これで、メンバーの行番号が与えられます。where節はrn = 1でなければなりません。y 1メンバーあたり1つの番号...そして、トップ100を選択してください – Veljko89

+0

どのOracleのバージョンですか? – trincot

+0

Oracleバージョン11 –

答えて

1

あなたはメンバーごとにその行番号とともに電話番号を取得するためのサブクエリを作成し、それらの最初のをフィルタリングできます。

SELECT * 
FROM (
     SELECT row_number() OVER (ORDER BY name ASC) rn, 
        name, 
        phone 
     FROM  members t0 
     LEFT JOIN member_identity 
       ON member_identity.id = t0.id 
     LEFT JOIN (
        SELECT member_id, 
         phone 
         row_number() OVER (PARTITION BY member_id ORDER BY (1)) ph_rn 
        FROM member_phone 
       ) member_phone 
       ON member_phone.member_id = t0.id 
       AND ph_rn = 1 
     WHERE  name LIKE 'U%' 
     ORDER BY name ASC 
     ) 
WHERE rn BETWEEN 0 AND 100 

私はなります

  • 使用結果セット(ORDER BY name ASC)としてrnの値を決定するための同じ順序。そうでない場合、ページ全体で順序が一致しません。
  • 外部WHEREの条件でBETWEENを使用しますが、下限条件(0)は最初のページでは必要ありません。
1

あなたはMAXに切り替えると、名前(ウィンドウ表示集計関数が後GROUP BY/HAVING言うアサーションされている)に直接ROW_NUMBERを適用することができます。

SELECT * FROM 
(  
     SELECT 
     row_number() over (ORDER BY NAME ASC) rn, 
     NAME, MAX(PHONE)  
     FROM MEMBERS t0  
     LEFT OUTER JOIN MEMBER_IDENTITY ON MEMBER_IDENTITY.ID=t0.ID 
     LEFT JOIN MEMBER_PHONE ON MEMBER_PHONE.MEMBER_ID=t0.ID  
     WHERE NAME LIKE 'U%' 
     GROUP BY NAME 
)  
WHERE rn >= 0 
AND rn <= 100 

または派生テーブルに集約を移動するに:

SELECT * FROM 
(  
     SELECT 
     row_number() over (ORDER BY NAME ASC) rn, 
     NAME, PHONE  
     FROM MEMBERS t0  
     LEFT OUTER JOIN MEMBER_IDENTITY ON MEMBER_IDENTITY.ID=t0.ID 
     LEFT JOIN 
     (SELECT MEMBER_ID, MAX(PHONE) AS PHONE 
     FROM MEMBER_PHONE 
     GROUP BY NAME 
     ) MEMBER_PHONE 
     ON MEMBER_PHONE.MEMBER_ID=t0.ID  
     WHERE NAME LIKE 'U%'   
)  
WHERE rn >= 0 
AND rn <= 100 
関連する問題