2017-07-28 8 views
2

私は2つのテーブルを持っています。必要なSQL結合は?

表1:

Name Date Project Hrs 
VKR 0727 X  8 
VKR 0728 A  4 
VKR 0728 B  4 
VKR 0729 C  8 

表2:

Name Date Project Hrs 
VKR 0728 123  8 
VKR 0729 234  8 
VKR 0730 345  8 

私は名前と日付でこれらのテーブルを結合する必要があると私は期待していた出力は以下のようになります。

Name Date Table1.Project Table1.Hrs Table2.Project Table2.Hrs 
VKR 0727 X    8      
VKR 0728 A    4   123   8 
VKR 0728 B    4 
VKR 0729 C    8   234   8 
VKR 0730       345   8 

私はFULL OUTER JOINを使ってみましたが、うまくいかないようです。これは私が直面している問題は、私が表2で同じキーを表1に同じ名前と日付のための2行と1行を持っている場合、私は表2から2行を取得するには、以下のようなものです私のクエリ

Select nvl(T1.Name,T2.Name), nvl(T1.Date,T2.Date), T1.Project, T1.Hrs, 
T2.Project, T2.Hrs from Table1 T1  
full outer join Table2 T2 on T1.Name = T2.Name 
and T1.Date = T2.Date 

です:

Name Date Table1.Project Table1.Hrs Table2.Project Table2.Hrs 
    VKR 0728 A    4   123   8 
    VKR 0728 B    4   123   8 

私はしたくありません。

何か助けていただければ幸いです。事前に感謝します

+1

それ?あなたが実際に結合を使って作業する方法を知らないのであれば、テーブルを結合することはたくさんのデータベースクエリで起こるので、理解してみてください... – KarelG

+0

@KarelG - あなたは完全に質問しました。レコードは返されません。理由は、内部継承のように動作する理由です。 –

+0

'Where'句を持たないことを確かめてください –

答えて

0

あなたのデータが設定されている方法は、0728のVKR名が123プロジェクトを含めるべきかどうかを知る方法がありません。どのプロジェクトが関連しているかを知るには、相互参照テーブルを使用してデータモデルを正規化するか、関連する表1のプロジェクトを格納するために表2の列を追加する必要があります。名前と日付のすべてのテーブル結合は、現在の設定とは異なるデータ設定を望む結果セットを提供します。

0

質問を理解した上で、table2のフィールドは、結合条件を満たすtable1の「最初の」行のみを表示します。あなたのクエリを少し変更したバージョンは、仕事を行います。

with T1 as 
(
    SELECT name, date, ROW_NUMBER() OVER(PARTITION BY name,date ORDER BY name) rn 
    FROM Table1 
) 
Select nvl(T1.Name,T2.Name), nvl(T1.Date,T2.Date), T1.Project, T1.Hrs, 
CASE 
    WHEN T1.rn IS NULL OR T1.rn = 1 THEN T2.Project 
END as t2_project, 
CASE 
    WHEN T1.rn IS NULL OR T1.rn = 1 THEN T2.Hrs 
END as t2_hrs 

from 
T1 
full outer join Table2 T2 on T1.Name = T2.Name 
and T1.Date = T2.Date 
あなたが理解するために[ `JOIN`](https://www.techonthenet.com/oracle/joins.php)PLSQLのドキュメントを読むことによって開始することができます
関連する問題