2011-01-18 7 views
3

最初の行は内部結合からのみ戻したいと考えています。私は2つのテーブルを持っています:INNER JOINの単一行を返す

TABLE_DとTABLE_Eの行は同じ作成日を持つことができますので、最初にこのセットからMAX(creationdate)を取得してからMAX(id)を取得しています。

 
SELECT 
a.id as A_ID, 
b.id as B_ID, 
c.id as C_ID, 
d.id as D_ID, 
e.id as E_ID, 
d.CREATIONDATE, 
a.REFNUMBER, 
a.DATECREATED, 
a.INFO, 
e.COST, 
FROM 
TABLE_A a 
INNER JOIN TABLE_B b ON (b.id = a.id) 
INNER JOIN TABLE_C c ON (c.id = b.id) 
INNER JOIN TABLE_D d ON 
(
    c.i = 
    (
     select 
     d.id 
     FROM TABLE_D 
     WHERE TABLE_D.id = c.id 
     AND TABLE_D.id = 
     (
     select 
     max(id) 
     from TABLE_D t1 
     where c_id = c.id 
     and CREATIONDATE = 
     (
      select 
      max(CREATIONDATE) 
      from TABLE_D t2 
      where t2.c_id = t1.c_id 
     ) 
    ) 
    ) 
) 

INNER JOIN TABLE_E e ON 
(
    d.i = 
    (
     select 
     e.d_id 
     from TABLE_E 
     where d_id = d.id 
     AND id = 
     (
     select 
     max(id) 
     from e t1 
     where e.d_id = d.id 
     and CREATIONDATE = 
     (
      select 
      max(CREATIONDATE) 
      from TABLE_E t2 
      where t2.d_id = t1.d_id 
     ) 
    ) 
    ) 
) 


最大のCreationDateととmax idが、私はそれ自身でそれを呼び出したときに正常に動作しますが、私はINNERに追加するとき、JOINことからすべての行を取得するために私のサブクエリを(参照:ここでは私の完全なクエリです私はテーブルDとテーブルEの各一致する行の行を取得しています。私がしたいのは、TABLE_Cに関連付けられたTABLE_Dの最新行とTABLE_Dに関連付けられたTABLE_Eの最新の行だけを表示するTABLE_A.idごとに1つの行です。

は例えば、私の結果セット内のidのは、現時点では次のようになります。あなたの助けを事前に

 
-------------------------------------------------------------------------- 
A_ID   B_ID   C_ID   D_ID   E_ID 
-------------------------------------------------------------------------- 
1    101    201    302    406 


ありがとう:私は必要なのこれです

 
-------------------------------------------------------------------------- 
A_ID   B_ID   C_ID   D_ID   E_ID 
-------------------------------------------------------------------------- 
1    101    201    301    401 
1    101    201    301    402  
1    101    201    301    403  
1    101    201    302    404 
1    101    201    302    405  
1    101    201    302    406  

答えて

1

SELECT * 
FROM 
(
SELECT 
    a.id as A_ID,b.id as B_ID,c.id as C_ID,d.id as D_ID,e.id as E_ID, 
    d.CREATIONDATE,a.REFNUMBER,a.DATECREATED,a.INFO,e.COST, 
    row_number() over (
     partition by a.id, b.id, c.id 
     order by d.CREATIONDATE DESC, d.id desc, e.CREATIONDATE DESC, e.id desc) RN 
FROM TABLE_A a 
INNER JOIN TABLE_B b ON (b.id = a.id) 
INNER JOIN TABLE_C c ON (c.id = b.id) 
INNER JOIN TABLE_D d ON d.c_id = c.id 
INNER JOIN TABLE_E e ON e.d_id = d.id 
) N 
WHERE RN = 1 

だけBY句PARTITIONとORDERが

partition by a.id, b.id, c.id 
    => start numbering from 1 again when any one of these changes 
order by d.CREATIONDATE DESC, d.id desc, e.CREATIONDATE DESC, e.id desc) 
    => number the rows in this order 
0

あなたはサブクエリでクエリを挿入することができ正しいことを確認しoracle11gで提供されて解析関数のROW_NUMBER()を使用し、 WHERE ROWNUM < 2フィルターを使用してください。

SELECT * FROM 
(/* Your SQL */) 
WHERE ROWNUM < 2 
+0

。私は、各A_IDに最新のD_IDとE_IDが必要であることを示すために、私の例に1つの結果を入れました。しかし、ありがとう。 – adamdunne

1

私が行うことは、内側のクエリをselect句に移動することです。私はフィルタリングの間に直接マッピングを維持します

SELECT 
a.id as A_ID, 
b.id as B_ID, 
c.id as C_ID, 
(select max(d.id) from d where d.id =c.id) as d_id) 
FROM 
TABLE_A a 
INNER JOIN TABLE_B b ON (b.id = a.id) 
INNER JOIN TABLE_C c ON (c.id = b.id) 
-1

多分これはあなたのために働くでしょうか?私はA_IDごとに行を必要として機能しません残念ながら

 
SELECT TOP 1 
a.id as A_ID, 
b.id as B_ID, 
c.id as C_ID, 
d.id as D_ID, 
e.id as E_ID, 
d.CREATIONDATE, 
a.REFNUMBER, 
a.DATECREATED, 
a.INFO, 
e.COST, 
FROM 
TABLE_A a 
INNER JOIN TABLE_B b ON (b.id = a.id) 
INNER JOIN TABLE_C c ON (c.id = b.id) 
INNER JOIN TABLE_D d ON (c.i = d.id) 
INNER JOIN TABLE_E e ON (d.i = e.id) 
ORDER BY d.creationdate DESC, e.creationdate DESC 
+0

SELECT TOP 1はOracleでは使用できません – Lunc