【问题标题】:What SQL join do i need?我需要什么 SQL 连接?
【发布时间】:2018-01-04 16:44:37
【问题描述】:

我有 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 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 中有 2 行相同的名称和日期,表 2 中有 1 行相同的键,我会从表 2 中得到 2 行,如下所示:

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

我不想要的。

感谢任何帮助。提前致谢

【问题讨论】:

  • 您可以先阅读JOIN plsql 文档来理解它吗?如果您真的不知道如何使用连接,请尝试理解它,因为连接表发生在许多数据库查询中......
  • @KarelG - 你是否完整地阅读了这个问题.. 即使在使用FULL OUTER JOIN 之后,所有记录都没有返回,为什么它像Inner join 那样工作,这就是问题所在。
  • 你确定没有Where子句
  • 这是完整的陈述吗?如果是,我很确定你不会得到你发布的结果。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    据我理解的问题,您只想为满足连接条件的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
    

    【讨论】:

      猜你喜欢
      • 2016-12-29
      • 2012-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-03
      • 2019-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多