SQL - Как заполнить значения NULL значением NOT NULL предыдущей совпавшей записи с помощью LEFT Join - PullRequest
0 голосов
/ 27 апреля 2020

Предположим, у меня есть 3 таблицы

TABLE1

ID   PERSON
1    ABC
3    DEF
5    GHI
7    JKL

TABLE2

ID   SPORT
1    CRICKET
2    RUNNING
3    TENNIS
1    HOCKEY
3    FOOTBALL

TABLE3

SPORT      PLAYER
CRICKET    SACHIN
RUNNING    USAIN
TENNIS     NULL
HOCKEY     NULL
FOOTBALL   MESSI 

КОГДА Я ИСПОЛЬЗУЮ ЭТОТ ЗАПРОС

SELECT A.PERSON, B.SPORT, C.PLAYER
FROM TABLE1 A LEFT JOIN TABLE2 B ON A.ID = B.ID
     LEFT JOIN TABLE3 C ON B.SPORT = C.SPORT

Это дает мне результат -

PERSON     SPORT      PLAYER
ABC        CRICKET    SACHIN
ABC        HOCKEY     NULL
DEF        TENNIS     NULL
GHI        NULL       NULL
JKL        NULL       NULL
DEF        FOOTBALL   MESSI

Я хочу, чтобы значение NULL в столбце PLAYER было заполнено предыдущим значением PLAYER для того же человека. Я хочу, чтобы результат запроса был ниже

PERSON     SPORT      PLAYER
ABC        CRICKET    SACHIN
ABC        HOCKEY     SACHIN
DEF        FOOTBALL   MESSI
DEF        TENNIS     MESSI
GHI        NULL       NULL
JKL        NULL       NULL

Есть ли способ добиться этого. Пожалуйста, помогите

1 Ответ

2 голосов
/ 27 апреля 2020

«Предыдущий» не имеет смысла в запросах SQL, если только нет столбца, определяющего порядок. С таким столбцом вы можете сделать:

SELECT A.PERSON, B.SPORT,
       COALESCE(LAG(C.PLAYER IGNORE NULLS) OVER (PARTITION BY A.PERSON ORDER BY <ordering col>) as Player
FROM TABLE1 A LEFT JOIN 
     TABLE2 B
     ON A.ID = B.ID LEFT JOIN
     TABLE3 C
     ON B.SPORT = C.SPORT

Если вы просто хотите, чтобы NULL значения были заполнены любым не- NULL значением, используйте MAX():

SELECT A.PERSON, B.SPORT,
       COALESCE(MAX(C.PLAYER IGNORE NULLS) OVER (PARTITION BY A.PERSON) as Player
FROM TABLE1 A LEFT JOIN 
     TABLE2 B
     ON A.ID = B.ID LEFT JOIN
     TABLE3 C
     ON B.SPORT = C.SPORT
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...