我需要帮助编写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查询中捕获的内容:
在EMP_ID上加入EMP_TABLE和DESC_TABLE并检索JOBDESC。
如果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的行)。
如果EMP_ID在EMP_TABLE中为空,那么我们应该在EMP_TABLE.NAME = DESC_TABLE.NAME(例如名称为DAVID的行)上加入DESC_TABLE。
是一个非常直接的查询,但是当我不得不将它与情景2& 3,我不知道该怎么办。我怀疑我可能不得不在子查询中使用nvl和case语句。
非常感谢任何帮助。如果这有任何区别,这个查询将在Teradata数据库上执行。
答案 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