2011-01-17 19 views
7

最初の行は内部結合からのみ戻したいと考えています。INNER JOINから返された1つの行が必要

SELECT a.id, 
     c.id, 
     d.id, 
     e.id, 
     d.CREATIONDATE, 
     a.REFNUMBER, 
     a.DATECREATED, 
     a.DESCRIPTION, 
     e.CATEGORYCODE, 
     e.OUTSTANDINGAM_MONAMT, 
     e.PREVPAIDAMOUN_MONAMT, 
     e.TOTALINCURRED_MONAMT, 
     e.LOSSFROMDATE, 
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 
     ) 
    ) 
    ) 
) 
:例えば、同一の作成は私が最初にこのセットからMAX(のCreationDate)、その後、その後、MAX(ID)を取得していますさかのぼることができTABLE Yで

TABLE_X | TABLE_Y 
id  | id creationdate xid 
1  | 1 01/01/2011 1 
2  | 2 01/01/2011 1 
3  | 3 31/12/2010 2 
4  | 4 28/12/2010 3 

行:私は2つのテーブルを持っています

私はそれ自身でそれを呼び出すが、私はINNERに追加したときに、私はテーブルYにそれぞれ一致する行の行を取得しています参加するときに、この作品

私がしたいことはXIDのCreationDateとIDによる最新のレコードがあります= TABLE_XのIDです。

+0

あなたは私たちに内部結合の試みを教えてもらえますか? –

+0

マルセロが言ったこと。おそらく問題はJOINそのものにあります。例えばidやMAX(id)に参加していますか? –

+1

MAX(id) - はXまたはYのID列ですか? –

答えて

0

「内部結合に追加するとき」?どのような内部結合?どのような内部結合?質問はひどく不足のですが、私はあなたがこの(私はあなただけで簡単に中括弧でそれらを入れて、一つの大きなクエリを構築することができ、明確にするためにビューを使用)必要があると思う:私は手で何のデータベースを持っていない

-- latest pairs of (id,creation) per xid 
create view latest_id_per_xid as 
    select xid,max(id) id,max(creation) creation from table_y group by xid; 

-- this view leaves only the rows from table_y that have the same (id,creation,idx) 
-- as the newest rows identified in the former view (it's basically a semijoin) 
-- you could also join on id alone 
create view latest_whole_y as 
    select table_y.* from table_y natural join latest_id_per_xid; 

-- now the answer is easy: 
select * from table_x join latest_whole_y 

を小さな間違いを確認してください。ただし、うまく動作するはずです。 (注意:新しいIDと古い日付のレコードがないことを前提としています)

1

これはそれになります 複合サブクエリは各Y.xidグループの最大日付を計算します。さらに最大Y_IDサブクエリが最大のCreationDateとメインクエリを持ってトップ1の結果をピックアップします

select *,(
select top 1 creationdate from Table_Y 
where from Table_Y.xId = m.id 
order by Table_Y.CreationDate 
) 
from Table_X m 

この文字列で検索してください

SELECT X.*, Y.* 
FROM TABLE_X X 
INNER JOIN (
    SELECT t1.xid, Max(t1.Y_id) MaxY_id 
    FROM 
     (SELECT t2.xid, MAX(t2.CREATIONDATE) MDate 
     FROM TABLE_Y t2 
     GROUP BY t2.xid) t 
    inner join TABLE_Y t1 
     on t.xid=t1.xid and t.MDate = t1.CREATIONDATE) MAXY 
    ON MAXY.xid = X.ID 
INNER JOIN TABLE_Y Y 
    ON Y.Y_ID = MAXY.MAXY_ID 
2

(これは表Yのキーを表してみましょうを)うまくいきますすべてのレコードを選択しますあなたが望む結果を持っています

+0

これはOracleでは動作しません.Oracleには「TOP」がなく、追加の列がある場合にはワイルドカードには指定されたテーブルが必要です。 – Allan

関連する問題