在查询下面,我获取散布在特定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
在此先感谢您的帮助!
答案 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 join
和NVL
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;