我需要什么SQL连接?

时间:2017-07-28 14:48:19

标签: sql oracle join plsql full-outer-join

我有2张桌子。

表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上加入这些表,我期望的输出应如下所示:

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,但这似乎不起作用。这是我的查询

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

我面临的问题是,如果我在Table1中有相同名称和日期的2行,并且Table2中的相同键有1行,我从Table2得到2行,如下所示:

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

我不想要。

感谢任何帮助。提前致谢

2 个答案:

答案 0 :(得分:0)

您的数据设置方式,0728上的VKR名称无法知道它是否应包含123项目。您需要使用交叉引用表来规范化数据模型,以了解哪些项目是相关的,或者在表2中添加一列来存储与表1相关的项目。名称和日期上的任何表格连接都将为您提供您所说的不希望数据设置的结果集。

答案 1 :(得分: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