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

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 

我所面临的问题是,如果我有两行相同名称和日期表1和1列于表2相同的键,我从表2 2行,类似下面:

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

我不想要。

任何帮助表示赞赏。在此先感谢

+1

您可以通过阅读['JOIN'(https://www.techonthenet.com/oracle/joins.php)PLSQL文档领悟启动它?如果你真的不知道如何使用连接,试着去理解它,因为连接表发生在很多数据库查询中...... – KarelG

+0

@KarelG - 你是否完全阅读了这个问题。即使在使用完全外部连接之后,记录没有被返回,为什么它像'Inner Join'这样的问题。 –

+0

你确定你没有'Where'子句 –

回答

0

您的数据设置的方式,没有办法让0728上的VKR名称知道它是否应包含123项目。您需要使用交叉引用表对数据模型进行规范化,以了解哪些项目相关,或者在表2中添加一列以存储与表1中相关的项目。 Name和Date上的任何表连接都会给你提供你所不希望的结果集,并且按照目前的方式进行数据设置。

0

据我了解的问题,你希望只在table1“第一”行满足连接条件显示table2领域。您查询的稍作修改的版本将做的工作:

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 
相关问题