Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
未找到匹配项时连接多个表的SQL查询_Sql_Database_Teradata - Fatal编程技术网

未找到匹配项时连接多个表的SQL查询

未找到匹配项时连接多个表的SQL查询,sql,database,teradata,Sql,Database,Teradata,我需要有关编写sql查询的帮助。所以我有这样一个场景,它要求我在一个公共键上连接两个表,并使用sql查询检索相关信息。如果找不到匹配项,那么我必须连接到另一个表,并检索一个新键以连接回这些表中的一个。让我用一些示例表更好地解释它 EMP_TABLE EMP_ID===NAME===LOCATION 1 CHRIS CA 2 MIKE FL NULL DAVID GA 4 GEORGE TX DESC_TABLE EMP_ID====NA

我需要有关编写sql查询的帮助。所以我有这样一个场景,它要求我在一个公共键上连接两个表,并使用sql查询检索相关信息。如果找不到匹配项,那么我必须连接到另一个表,并检索一个新键以连接回这些表中的一个。让我用一些示例表更好地解释它

EMP_TABLE
EMP_ID===NAME===LOCATION
 1      CHRIS   CA
 2      MIKE    FL
 NULL   DAVID   GA
 4      GEORGE  TX

DESC_TABLE
EMP_ID====NAME===JOBDESC
 1       CHRIS   LAWYER
 2       MIKE    DOCTOR
 3       DAVID   ENGINEER
 5       GEORGE  CEO

NEW_EMP_TABLE
NEW_EMP_ID===EMP_ID===NAME
  5             4         GEORGE
这里EMP_表是主表,我们需要这个表中的所有字段加上我的结果集中DESC_表中的JOBDESC字段

下面是我希望在sql查询中捕获的内容:

  • 在EMP_ID上连接EMP_表和DESC_表并检索JOBDESC

  • 如果EMP_表中的EMP_ID与DESC_表中任何行的EMP_ID不匹配,则根据EMP_表从NEW_EMP_表中查找NEW_EMP_ID值。EMPID=NEW_EMP_TABLE.EMP_ID,并使用该NEW_EMP_ID值将其连接回NEW_EMP_表上的DESC表。NEW_EMP_ID=DESC TABLE.EMP_ID并获取JOBDESC值(例如,查看名为GEORGE的行)

  • 如果EMP_表中的EMP_ID为null,那么我们应该加入EMP_表中的DESC_表。NAME=DESC_表。NAME(例如,名为DAVID的行)

  • 这是一个非常直截了当的查询,但当我必须将其与场景2和3结合起来时,我不确定如何继续。我怀疑我可能必须在子查询中使用nvl和case语句


  • 如果有任何帮助,我们将不胜感激。如果这有什么不同,我们将在Teradata数据库上执行此查询。

    我想如果您的场景相互排斥,这将非常简单。这意味着下面三个选择不会为同一名员工带来多个记录。但在这种情况下,您需要向我们提供logic关于如何消除重复数据

    select EMP_TABLE.*, DESC_TABLE.JOBDESC
    from EMP_TABLE 
    join DESC_TABLE 
    on EMP_TABLE.EMP_ID= DESC_TABLE.EMP_ID
    and EMP_TABLE.EMP_ID is not null
    
    union
    
    select EMP_TABLE.*, DESC_TABLE.JOBDESC
    from EMP_TABLE
    join NEW_EMP_TABLE
    on EMP_TABLE.EMP_ID= NEW_EMP_TABLE.EMP_ID
    and EMP_TABLE.EMP_ID is not null 
    join DESC_TABLE 
    on NEW_EMP_TABLE.NEW_EMP_ID= DESC_TABLE.EMP_ID
    
    union
    
    select EMP_TABLE.*, DESC_TABLE.JOBDESC
    from EMP_TABLE 
    join DESC_TABLE 
    on EMP_TABLE.NAME= DESC_TABLE.NAME
    and EMP_TABLE.EMP_ID is null
    

    提示:在
    EMP\u表
    NEW\u EMP\u表
    上通过union获得不同的EMP\u ID,并从
    DESC\u表
    中选择
    JOBDESC
    ,其中
    EMP\u ID
    在结果的
    EMP\u ID
    列表中,我不知道为什么要为同一类数据创建一个表。可能是您应该重新构造您的schema@Bharadwaj..如果在DESC_表中没有匹配的EMP_ID,我将不得不从基于EMP_ID的NEW_EMP_表中查找新的EMP_ID,并使用它连接回DESC_表。如果我在EMP_表和NEW_EMP_表上进行合并,并仅获得不同的EMP_ID,那么我将丢失新的EMP_ID行5次,对吗?这意味着我将无法匹配?@zamil,these只是我为了更好地解释场景而放的示例表。实际的表有点不同,但场景仍然是一样的。因为您只需要
    JOBDESC
    ,为什么需要加入?在第三种情况下,为什么EMP_ID为null?这不是PK吗?如果您想用NAME加入,那么您可能无法获得准确的结果不会是唯一的。谢谢。我通过对第二个union语句进行轻微修改来实现您的建议。我已将减号运算符合并到EMP_表和DESC_表之间的EMP_ID代码中,这样,只有在DESC_表中不存在的EMP_ID的结果子集才会连接到新的_EMP表。Appreci吃了帮助。