2017-05-19 6 views
0

私はSQLクエリに助けが必要です私はLEFT OUTER JOINを使って結合する必要がある2つのテーブルを持っています。その特定のビューに対するデータベースビュー。名前を探すために結合のクエリを実行すると、そのAの最新のブランド "AP"を取得する必要があります。 表1最新の値のみを返す必要があるJOINクエリの上にビューを作成するのに助けが必要です

ID  name  address 
----------------------- 
1  A   ATL 
2  B   ATL 

TABLEは2

ID  PER_ID brand  DATEE 
-------------------------------------------- 
1  1   MS   5/19/17:1:00pm 
2  1   XB   5/19/17:1:05pm 
3  1   AP   5/19/17:2:00pm 
4  2   RO   5/19/17:3:00pm 
5  2   WE   5/19/17:4:00pm 

私は、正しい結果を返すクエリを試してみましたが、私は参加の上にデータベースビューを構築しようとすると、私は、問題1を取得します。私はクエリbを試みたが、私はOracleのSQLデベロッパーで私のビューを照会するとき、私はまだすべての結果を得るが、最新のものは得られない。

クエリA:

SELECT * from table_1 
left outer join table_2 on table_1.ID = Table_2.PER_ID 
AND table_2.DATE = (SELECT MAX(DATE) from table_2 z where z.PER_ID = table_2.PER_ID) 

問題1

Error report - 
ORA-01799: a column may not be outer-joined to a subquery 
01799. 00000 - "a column may not be outer-joined to a subquery" 
*Cause: <expression>(+) <relop> (<subquery>) is not allowed. 
*Action: Either remove the (+) or make a view out of the subquery. 
      In V6 and before, the (+) was just ignored in this case. 

クエリ2:

SELECT * from table_1 
    left outer join(SELECT PER_ID,brand, max(DATEE) from table_2 group by brand,PER_ID) t2 on table_1.ID = t2.PER_ID 

答えて

1

使用row_number()

select t1.id, t1.name, t1.address, t2.id as t2_id, t2.brand, t2.datee 
from table_1 t1 left outer join 
    (select t2.*, 
      row_number() over (partition by per_id order by date desc) as seqnum 
     from table_2 t2 
    ) t2 
    on t1.ID = t2.PER_ID and t2.seqnum = 1; 

ビューを定義するときは、明示的に列をリストする習慣が必要です。

+0

返信いただきありがとうございます。私はoracle sql開発者にあなたのコードを試しましたが、今私はt2.brandが無効な修飾子になります – stevestark

+0

それぞれに使用されるすべての列名とエイリアスをチェックしてください。列の参照が不正確な場合に発生する単なるエラーです。テーブル(またはそれらのテーブルの完全なddl)にアクセスすることなくデバッグすることはできません。 ps:私は "date desc by order"を "datee desc by order"とするべきだと思う)["e"が足りない] –

+0

ありがとう、私はそれを修正した。私はこの解決策に関連する1つの質問。それは最速の解決策ですか?私がテーブル3,4,5を追加したいと思ったら、それぞれ左の外部結合を行い、遅れを経験しますか? – stevestark

関連する問題