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 查询中捕获的内容:
在 EMP_ID 上加入 EMP_TABLE 和 DESC_TABLE 并检索 JOBDESC。
如果 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 的行)。
如果 EMP_ID 在 EMP_TABLE 中为空,那么我们应该在 EMP_TABLE.NAME = DESC_TABLE.NAME 上加入 DESC_TABLE(名称为行例如大卫)。
是一个非常直接的查询,但是当我必须将其与场景 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
我在编写 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 查询中捕获的内容:
在 EMP_ID 上加入 EMP_TABLE 和 DESC_TABLE 并检索 JOBDESC。
如果 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 的行)。
如果 EMP_ID 在 EMP_TABLE 中为空,那么我们应该在 EMP_TABLE.NAME = DESC_TABLE.NAME 上加入 DESC_TABLE(名称为行例如大卫)。
是一个非常直接的查询,但是当我必须将其与场景 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