【问题标题】:SQL - How to fill NULL values with NOT NULL value of previous matched record with LEFT JoinSQL - 如何用左连接的先前匹配记录的 NOT NULL 值填充 NULL 值
【发布时间】:2020-04-27 15:10:55
【问题描述】:

假设我有 3 张桌子

表 1

ID   PERSON
1    ABC
3    DEF
5    GHI
7    JKL

表2

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

表3

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

我希望将 PLAYER 列中的 NULL 值填充为同一个人的先前 PLAYER 值。 我想要查询结果如下

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

有什么方法可以实现这一点。请帮忙

【问题讨论】:

  • 上一个 - 根据什么?
  • @jarlh 请看最后一个查询结果,我提到了人 ABC 有 SACHIN & NULL 值与之关联,所以我希望 ABC 人都应该返回 SACHIN 而不是 SACHIN & NULL

标签: sql oracle


【解决方案1】:

"Previous" 在 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

如果您只想用 anyNULL 值填充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

【讨论】:

    猜你喜欢
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多