2014-01-30 28 views
0

这是一个更大的桌子的小型摘录得出的值替换为空值,称之为日志:HSQLDB的查询与来自另一个记录

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'列与来自'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。

回答

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 
+0

感谢您的回答,它看起来可能会简化我的生活,但我不确定如何在我的查询结构中实现它。上面的问题只是一个更大的多个连接查询中的一小部分。我是SQL新手,对于HSQLDB来说很新,并且http://hsqldb.org/doc/guide/sqlgeneral-chapt.html上的用户指南似乎没有太多关于使用横向的。使用上面的例子,你能解释查询的工作原理吗?谢谢你的时间。 –

+0

如果LATERAL太难实现,则使用标量子查询。在两种情况下,对于每个为null的值,都会执行子查询以从其他行中获取非空值。 – fredt

+0

你给出的标量方法也得到了我的答案,但比第一个答案复杂得多。这种方法还将查询的处理时间缩短了近50%(约5秒到约2.5秒)。再次感谢。 –

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功能。

+0

这符合法案。我忘记提及除'RN'列以外的所有内容都可能会重复多次,但所有重复都被键入另一列'R'中,我没有列出。通过修改你对fid和r的答案,并加入fid和r,这让我有权得到我需要的答案。感谢您的快速和准确的反应! –

+0

@Gordon Linoff,HSQLDB没有实现哪些SQL特性?请参阅下面的替代答案,对于更大的数据集可能更有效。 – fredt

相关问题