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

SQL query to join multiple tables when no match found

我在编写 sql 查询方面需要帮助。所以我有这种情况,需要我在一个公共键上加入两个 table,并使用 sql 查询检索相关信息。如果找不到匹配项,那么我将不得不加入另一个 table 并检索一个新密钥以重新加入其中一个 table。让我用一些例子 tables 更好地解释它。

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 是主要的 table,我们需要这个 table 的所有字段加上我的结果集中 DESC_TABLE 的 JOBDESC 字段。

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

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

  2. 如果 EMP_TABLE 中的 EMP_ID 与任何行的 DESC_TABLE 中的 EMP_ID 不匹配,则查找 NEW_EMP_ID 基于 EMP_TABLE.EMPID = NEW_EMP_TABLE.EMP_ID 的 NEW_EMP_TABLE 值,并使用该 NEW_EMP_ID 值将其加入到 NEW_EMP_TABLE.NEW_EMP_ID = 上的 DESC table DESC_TABLE.EMP_ID 并获取 JOBDESC 值(例如查看名称为 GEORGE 的行)。

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

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

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

我想这很简单,以防您的方案相互排斥。这意味着下面的三个选择不会为同一员工带来多条记录。但在那种情况下,您需要向我们提供有关如何进行重复数据删除的逻辑。

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