我有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
我不想要。
感谢任何帮助。提前致谢
答案 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