HSQLDB查询用从另一个记录派生的值替换空值

时间:2014-01-30 22:30:22

标签: sql null hsqldb coalesce

这是一个较大的表的一小段摘录,称之为LOG:

RN EID FID FRID TID TFAID  
1 364   509 7045    null    7452  
2 364   509 7045    7452    null  
3 364   509 7045    7457    null  
4 375   512 4525    5442    5241  
5 375   513 4525    5863    5241  
6 375   515 4525    2542    5241  
7 576   621 5632    null    5452  
8 576   621 5632    2595    null  
9 672   622 5632    null    5966  
10 672  622 5632    2635    null  

我想要一个查询,它会将'TFAID'列中的null替换为匹配的'FID'列中'TFAID'列的值。

所需的输出因此是:

RN EID FID FRID TID TFAID  
1 364   509 7045    null    7452  
2 364   509 7045    7452    7452  
3 364   509 7045    7457    7452  
4 375   512 4525    5442    5241  
5 375   513 4525    5863    5241  
6 375   515 4525    2542    5241  
7 576   621 5632    null    5452  
8 576   621 5632    2595    5452  
9 672   622 5632    null    5966  
10 672  622 5632    2635    5966 

我知道像

这样的东西
    SELECT RN, 
        EID, 
        FID, 
        FRID, 
        TID, 
        (COALESCE TFAID, {insert clever code here}) AS TFAID
    FROM LOG

是我需要的,但我不能为我的生活提出一些巧妙的SQL来填补正确的TFAID。

2 个答案:

答案 0 :(得分:0)

这是一种方法。这会聚合日志以获取值,然后将结果加入:

SELECT l.RN, l.EID, l.FID, l.FRID, l.TID, 
       COALESCE(l.TFAID, f.TFAID) AS TFAID
FROM LOG l join
     (select fid, max(tfaid) as tfaid
      from log
      group by fid
     ) f
     on l.fid = f.fid;

可能还有其他更有效的方法。但是,HSQL并没有实现所有SQL功能。

答案 1 :(得分:0)

HSQLDB支持可用作备选方案的SQL功能。其他一些数据库不支持这些功能。

CREATE TABLE LOG (RN INT, EID INT, FID INT, FRID INT, TID INT, TFAID INT);

-- using LATERAL
SELECT l.RN, l.EID, l.FID, l.FRID, l.TID, 
   COALESCE(l.TFAID, f.TFAID) AS TFAID
   FROM LOG l , LATERAL (SELECT MAX(TFAID) AS TFAID FROM LOG f WHERE f.FID = l.FID) f

-- using scalar subquery
SELECT l.RN, l.EID, l.FID, l.FRID, l.TID, 
   COALESCE(l.TFAID, (SELECT MAX(TFAID) AS TFAID FROM LOG f WHERE f.FID = l.FID)) AS TFAID
   FROM LOG l