找不到匹配项时,SQL查询连接多个表

时间:2015-12-29 03:55:34

标签: 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====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_TABLE是主表,我们需要此表中的所有字段以及结果集中DESC_TABLE的JOBDESC字段。

以下是我想在sql查询中捕获的内容:

  1. 在EMP_ID上加入EMP_TABLE和DESC_TABLE并检索JOBDESC。

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

  3. 如果EMP_ID在EMP_TABLE中为空,那么我们应该在EMP_TABLE.NAME = DESC_TABLE.NAME(例如名称为DAVID的行)上加入DESC_TABLE。

  4. 是一个非常直接的查询,但是当我不得不将它与情景2& 3,我不知道该怎么办。我怀疑我可能不得不在子查询中使用nvl和case语句。

  5. 非常感谢任何帮助。如果这有任何区别,这个查询将在Teradata数据库上执行。

1 个答案:

答案 0 :(得分:0)

我想如果您的场景是互斥的,这是相当简单的。这意味着下面的三个选项不会为同一个员工带来多个记录。但在这种情况下,您需要向我们提供有关如何进行重复数据删除的逻辑。

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