Оптимизация вывода Oracle JOIN - PullRequest
0 голосов
/ 25 января 2019

Используя приведенный ниже запрос, я извлекаю некоторые детали, разбросанные по трем различным таблицам конкретной схемы базы данных 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, т. Е. Немногим пользователям не назначены никакие задачи, поэтому их идентификаторы явно отсутствуют в таблице USERDB_TASKS.

Используя приведенный выше запрос, я получаю информацию только о тех пользователях, чей USERID присутствует в таблицах USERDB, а также в таблицах USERDB_TASKS. У меня вопрос, как я могу изменить свой запрос таким образом, чтобы для всех тех немногих USERID, которые присутствуют только в таблице USERDB, а не в таблице USERDB_TASKS, значение для столбца TASKNAME должно быть равно NONE, например, как показано ниже ...

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

Заранее спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Используйте 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
. . .
0 голосов
/ 25 января 2019

Используйте 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...