2012-02-17 7 views
0

子レコードに最新の作成データを取得する必要があります。SQlクエリ:子レコードに最新の作成データを取得する必要があります

AとBの2つのテーブルがあるとします.Aは親でBは子です。彼らは1:Mの関係を持っています。両方ともいくつかの列を持ち、BテーブルにはテーブルBのレコードの作成日を保持する「作成日」列もあります。

今、Aテーブルからすべてのレコードをフェッチできる最新のBテーブルから作成された子レコード。 2つの子レコードが今日親レコードのためにテーブルBに作成された場合、そのうちの最新のレコードがフェッチされるはずです。

テーブルの1つのレコードには多くの子がある可能性がありますので、どうすればこの問題を解決できますか。

結果がでなければなりません - 以下TBLのAの列、TBLのBの列(最新の1を作成した)

+1

いくつかのデータサンプルとテーブル構造を提供できますか?それはより速く、より速いです..誰もが確認し、助けることができます。 –

答えて

0

はあなたを助けることができるクエリです。

select x, y from (select a.coloumn_TAB_A x, b.coloumn_TAB_B y from TableA a , 
TableB b where a.primary_key=b.primary_key 
and a.Primary_key ='XYZ' order by b.created_date desc) where rownum < 2 

ここでは、降順で表Bの作成日付の列にそれらを注文し、2つのテーブルABを持っている主キーに基づいて、それらに参加しました。

外部クエリのインラインビューとしてこの出力を使用し、x、yのようなcoloumnを選択します。ここでrownum < 2(これはテーブルBの最新のレコードを取得します)

0

「作成日」がDATETIME列であることを希望します。これにより、最新の子レコードが得られます。これは、最も効率的ではありませんが、動作します

select A.*, B.* 
from A 
join B on A.ParentID = B.ParentID 
join (
    select ParentID, max([created date]) as [created date] 
    from B 
    group by ParentID 
) maxchild on A.ParentID = maxchild.ParentID 
where B.ParentID = maxchild.ParentID and B.[created date] = maxchild.[created date] 
+0

こんにちはキース、お返事ありがとうございます。しかし、私はあなたにここでクエリを取得していません。 'A.ParentID = B.ParentID'のようにします。私はあなたが 'A.PK = B.FK'にしたいと思う。このクエリがどのように機能しているか理解してもらえますか? – user1173496

+0

正しいです。表Aの主キーは表Bの外部キーです。サブクエリはすべてのPKの最新レコードを検索します –

-1

....あなたが外部キーとして子テーブル内の同じのParentIDを持つ親テーブルに一貫性のあるIDを持っていると仮定すると(のみSQL):

SELECT [Table_A].[Columns], [Table_B].[Columns] 
    FROM [Table_A] 
    LEFT OUTER JOIN [Table_B] 
    ON [Table_B].ForeignKey = [Table_A].PrimaryKey 
    AND [Table_B].PrimaryKey = (SELECT TOP 1 [Table_B].PrimaryKey 
           FROM [Table_B] 
           WHERE [Table_B].ForeignKey = [Table_A].PrimaryKey 
           ORDER BY [Table_B].CREATIONDATE DESC) 
+0

これはPL/SQLでは機能しません – Sathya

0

あなたはAのためのダミーデータを提供するために、CTEを使用し

複数回、各テーブル(または特異的Bを)打つ避けるためにanalytic functionsを使用することができますし、Bあなたがこれを行うことができます:

with A as (
    select 1 as id from dual 
    union all select 2 from dual 
    union all select 3 from dual 
), 
B as (
    select 1 as a_id, date '2012-01-01' as created_date, 'First for 1' as value 
     from dual 
    union all select 1, date '2012-01-02', 'Second for 1' from dual 
    union all select 1, date '2012-01-03', 'Third for 1' from dual 
    union all select 2, date '2012-02-01', 'First for 2' from dual 
    union all select 2, date '2012-02-03', 'Second for 2' from dual 
    union all select 3, date '2012-02-01', 'First for 3' from dual 
    union all select 3, date '2012-02-03', 'Second for 3' from dual 
    union all select 3, date '2012-02-05', 'Third for 3' from dual 
    union all select 3, date '2012-02-09', 'Fourth for 3' from dual 
) 
select id, created_date, value from (
    select a.id, b.created_date, b.value, 
     row_number() over (partition by a.id order by b.created_date desc) as rn 
    from a 
    join b on b.a_id = a.id 
) 
where rn = 1 
order by id; 

     ID CREATED_D VALUE 
---------- --------- ------------ 
     1 03-JAN-12 Third for 1 
     2 03-FEB-12 Second for 2 
     3 09-FEB-12 Fourth for 3 

あなたはABからあなたが望む任意の列を選択することができますが、両方のテーブルに同じ名前のいずれかがある場合は、サブクエリでそれらをエイリアスする必要があります。

同じ作成日の子レコードを持つことができる場合は、row_numberの代わりにrank()またはdense_rank()を適切に処理する必要があります。

関連する問題