Как получить в подзапросах с идентификатором текущей строки? - PullRequest
0 голосов
/ 26 октября 2018

Сообщество Hi StackOverflow,

Я очень новичок в SQL, и у меня возник вопрос с проблемой, которая у меня возникла, и я не знаю, как ее исправить (кстати, я новичок в SQL).

Итак, у меня есть эти таблицы:

TABLE 1 - Users
-ID     -NAME
1       User1       
2       User2       
3       User3       



TABLE 2 - JOBS
-ID     -JOB                    -USER       -ID_DIRECCTION
1       Football Match          User1       1                  
2       Bascketball Match       User3       1                   
3       Swimming Race           User2       2                   
4       Handball Game           User3       2                   
5       Tennis Match            User2       3                   



TABLE 3 - DIRECCTIONS
-ID     -DIRECCTION         -NUMBER
1       Fail Street         34
2       Swimming Street     45
3       Fake Street         01

То, что я хочу сделать, это показать таблицу заданий, но добавить новый столбец с SELECT, который показывает последнего пользователя, который был в направлении (если никто не был в этом направлении, результат будет нулевым) и если несколько пользователей - самый последний.

Я близок, чтобы получить его с моим текущим запросом (я думаю), но главная проблема в том, что когда я делаю подзапрос, есть способ получить внутренний запрос с идентификатором текущей строки, где выполняется основной запрос ??

SELECT j.ID, j.JOB, j.USER, j.ID_DIRECCTION,
(SELECT j.USER
FROM USERS u INNER JOIN
     JOBS j
     ON j.USER = u.ID INNER JOIN
     DIRECCTIONS d
     ON d.ID = j.ID_DIRECCTION
WHERE d.ID = (SELECT d.ID FROM DIRECCTIONS WHERE d.ID = j.ID_DIRECCTION --I want this to be current ID_DIRECCTION row)  
ORDER BY j.ID DESC FETCH FIRST 1 ROWS ONLY
) AS LAST_USER
FROM JOBS j;

Как выбрать идентификатор текущей строки для извлечения других вещей в подзапросах ????

Результат должен быть таким:

-ID     -JOB                    -USER       -ID_DIRECCTION      -LAS_TUSER
1       Football Match          User1       1                   null*
2       Bascketball Match       User3       1                   User1*
3       Swimming Race           User2       2                   null*
4       Handball Game           User3       2                   User2*
5       Tennis Match            User2       3                   User3*

Но я всегда получаю одно и то же значение в LAST_USER

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Из вашего вопроса неясно, действительно ли у вас есть имя пользователя в таблице заданий или просто идентификатор.

Если у вас есть имя, то у вас есть вся необходимая информация в таблице заданий и Вы можете просто использовать lag().

Но если у вас есть идентификатор, вам нужно присоединиться к таблице пользователей, как для текущих, так и для идентификаторов задержки.Вы все еще можете получить предыдущий идентификатор таким же образом:

select id, job, id_user, id_direcction,
  lag(id_user) over (partition by id_direcction order by id) as last_id_user
from jobs

, но затем использовать его в качестве CTE или встроенного представления и присоединиться к нему:

select j.id, j.job, u.name, j.id_direcction, lu.name as last_name
from (
  select id, job, id_user, id_direcction,
    lag(id_user) over (partition by id_direcction order by id) as last_id_user
  from jobs
) j
join users u on u.id = j.id_user
left join users lu on lu.id = j.last_id_user

С помощью CTE для предоставленияпримеры данных и предположения о том, что на самом деле они содержат:

-- sample data
with users (id, name) as (
            select 1, 'User1' from dual
  union all select 2, 'User2' from dual
  union all select 3, 'User3' from dual
),
jobs (id, job, id_user, id_direcction) as (
            select 1, 'Football Match', 1, 1 from dual
  union all select 2, 'Bascketball Match', 3, 1 from dual
  union all select 3, 'Swimming Race', 2, 2 from dual
  union all select 4, 'Handball Game', 3, 2 from dual
  union all select 5, 'Tennis Match', 2, 3 from dual
)
-- actual query
select j.id, j.job, u.name, j.id_direcction, lu.name as last_name
from (
  select id, job, id_user, id_direcction,
    lag(id_user) over (partition by id_direcction order by id) as last_id_user
  from jobs
) j
join users u on u.id = j.id_user
left join users lu on lu.id = j.last_id_user
order by j.id;

        ID JOB               NAME  ID_DIRECCTION LAST_
---------- ----------------- ----- ------------- -----
         1 Football Match    User1             1      
         2 Bascketball Match User3             1 User1
         3 Swimming Race     User2             2      
         4 Handball Game     User3             2 User2
         5 Tennis Match      User2             3      

Вам не нужно обращаться к таблице direcctions, если вы не хотите получить ее описание.Я включил версию, которая делает это в этой базе данных <> fiddle .

Как и @KaushikNayak, я не понимаю, как и почему вы ожидаете увидеть User3 противпоследняя строка на основе предоставленных вами данных.

0 голосов
/ 26 октября 2018

Кажется, вы хотите LAG, но не совсем понятно, почему LAS_TUSER = User3 для теннисного матча (идентификатор задания 5)

SELECT j.*, 
       LAG(u.name) 
         over ( 
           PARTITION BY j.id_direcction 
           ORDER BY j.id ) 
FROM   users u 
       inner join jobs j 
               ON j.username = u.name 
ORDER  BY j.id 

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...