Oracle JOIN输出优化

时间:2019-01-25 12:51:09

标签: sql oracle

在查询下面,我获取散布在特定oracle数据库模式的三个不同表中的一些详细信息...

SELECT USERNAME, FULLNAME, DEPARTMENT, TASKNAME 
FROM USERDB t1 
JOIN USERDB_TASKS t3 ON t1.USERID = t3.USERID 
JOIN TASKS t2 ON t3.TASKSID = t2.TASKSID;

当前输出:

USERNAME FULLNAME     DEPARTMENT TASKNAME
duryo    dur yogeli   IT         Domain admin
rected   rec tedenson SALES      Process manager

这里的表USERDB包含四列USERID,USERNAME,FULLNAME和DEPARTMENT。表USERDB_TASKS包含两列USERID,TASKSID。表TASKS包含两列TASKSID,TASKNAME。

对于特定用户,USERID在所有表中均相同。同样,特定任务的TASKSID在所有表中都相同。

但是实际上,表USERDB中的USERID很少,而表USERDB_TASKS中没有,也就是说,很少有用户没有分配任何任务,因此很明显,他们的ID在USERDB_TASKS表中不存在。

使用上述查询,我​​仅获得USERDB和USERDB_TASKS表中都存在USERID的那些用户的详细信息。我的问题是我该如何修改查询,使得对于仅在USERDB表中而不在USERDB_TASKS表中存在的所有少数USERID,TASKNAME列的值应为NONE,例如如下所示... < / p>

USERNAME FULLNAME     DEPARTMENT TASKNAME
duryo    dur yogeli   IT         Domain admin
rected   rec tedenson SALES      Process manager
Ueswit   Ues witer    Market     NONE

在此先感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

使用LEFT JOIN。我也强烈建议您限定所有列名,以便查询如下:

SELECT u.USERNAME, u.FULLNAME, u.DEPARTMENT, t.TASKNAME 
FROM USERDB u LEFT JOIN
     USERDB_TASKS ut
     ON ut.USERID = u.USERID LEFT JOIN
     TASKS t
     ON t.TASKSID = ut.TASKSID;

这将返回t.TASKNAME作为NULL值-对我来说很有意义。但是,如果要使用'NONE',请使用COALESCE()

SELECT u.USERNAME, u.FULLNAME, u.DEPARTMENT,
       COALESCE(t.TASKNAME, 'NONE') as TASKNAME
. . .

答案 1 :(得分:0)

使用Left outer joinNVL

SELECT USERNAME, FULLNAME, DEPARTMENT, NVL(TASKNAME, 'NONE') 
  FROM USERDB t1 
  JOIN INNER JOIN USERDB_TASKS t3 ON t1.USERID=t3.USERID 
  LEFT OUTER TASKS t2 ON t3.TASKSID=t2.TASKSID;