sqlite查询 - 在空记录之间添加记录的关键字?

时间:2014-01-28 23:48:48

标签: sql sqlite

我正在查询存储在数据库中的一些系统日志,不幸的是,供应商在根据表关系创建数据库结构方面做得很差。我通常用于此类事情的报告工具依赖于标准SQLite查询(无脚本/编码),我更倾向于使用该标准报告工具将系统中的用户操作提交给该报告,以便可以对其进行调度和监视。确保它运行。

这些日志列出了用户在系统中执行的操作,我需要将两个表绑在一起,以获得他们所做的最新报告。

表1:供应商很友好,可以在此包含密钥。

Key                     Other_Columns
-------------------------------------
jdoe|20140122|093537    stuff
jdoe3|20140122|093657   stuff
jdoe2|20140122|151644   stuff

表2:此处没有任何键,但它会绑定到另一个表。

UID     Date        Time       Server    Action
------------------------------------------------
jdoe    1/22/2014   9:35:37
jdoe    1/22/2014   9:35:37    server1   action1
jdoe    1/22/2014   9:35:41    server1   action2
jdoe3   1/22/2014   9:36:57
jdoe3   1/22/2014   9:36:58    server3   action1
jdoe3   1/22/2014   9:37:01    server4   action2
jdoe2   1/22/2014   15:16:44
jdoe2   1/22/2014   15:16:44   server2   action1
jdoe2   1/22/2014   15:16:46   server2   action2
jdoe2   1/22/2014   15:16:49   server2   action3

现在为了使这更有趣,你会注意到表1中的Key使用时间戳作为其中的一部分。对于服务器和服务器的用户,时间戳匹配表2中的第一个时间戳。行动是空白的。如果您查询表2并按日期排序,那么时间,用户所做操作的每个日志部分都以时间戳和空白服务器&行动条目。我可以想到加入这些的唯一方法是通过某种方式使用UID,Date,Time列为表2创建一个键,但我需要将相同的键应用于null操作/服务器行之间的每一行。这让我很难过。

我在想我需要自己查询表2创建下面的临时表,然后将其连接回表1,但我不知道如何编写一个可以从表2生成下面的输出的查询:

UID      Date         Time       Server     Action     Key
----------------------------------------------------------------------------
jdoe     1/22/2014    9:35:37                          jdoe|20140122|093537
jdoe     1/22/2014    9:35:37    server1    action1    jdoe|20140122|093537
jdoe     1/22/2014    9:35:41    server1    action2    jdoe|20140122|093537
jdoe3    1/22/2014    9:36:57                          jdoe3|20140122|093657
jdoe3    1/22/2014    9:36:58    server3    action1    jdoe3|20140122|093657
jdoe3    1/22/2014    9:37:01    server4    action2    jdoe3|20140122|093657
jdoe2    1/22/2014    15:16:44                         jdoe2|20140122|151644
jdoe2    1/22/2014    15:16:44   server2    action1    jdoe2|20140122|151644
jdoe2    1/22/2014    15:16:46   server2    action2    jdoe2|20140122|151644
jdoe2    1/22/2014    15:16:49   server2    action3    jdoe2|20140122|151644

我不确定这是否可能,但如果是的话,我希望有人知道。

思想?

2 个答案:

答案 0 :(得分:0)

这可能会做你想要的:

select t2.*,
       (select "key"
        from table1 t1
        where t1."key" >= t2.uid || '|' || strftime(date, '%Y%m%d')
        order by t1."key"
        limit 1
       ) as "Key"
from table2 t2;

它找到的第一个键大于与日期连接的uid。那应该是你想要的那个。

答案 1 :(得分:0)

SQLite不支持该日期格式。 您必须使用字符串操作来提取日期字段:

SELECT *,
       Table2.UID || '|' ||
       CASE
       WHEN Table2.Date LIKE '__/__/____' THEN substr(Table2.Date, 7, 4) ||        substr(Table2.Date, 4, 2) ||        substr(Table2.Date, 1, 2)
       WHEN Table2.Date LIKE '_/__/____'  THEN substr(Table2.Date, 6, 4) ||        substr(Table2.Date, 3, 2) || '0' || substr(Table2.Date, 1, 1)
       WHEN Table2.Date LIKE '__/_/____'  THEN substr(Table2.Date, 6, 4) || '0' || substr(Table2.Date, 4, 1) ||        substr(Table2.Date, 1, 2)
       WHEN Table2.Date LIKE '_/_/____'   THEN substr(Table2.Date, 5, 4) || '0' || substr(Table2.Date, 3, 1) || '0' || substr(Table2.Date, 1, 1)
       END || '|' ||
       CASE
       WHEN Table2.Time LIKE '__:__:__' THEN        substr(Table2.time, 1, 2) || substr(Table2.time, 4, 2) || substr(Table2.time, 7, 2)
       WHEN Table2.Time LIKE '_:__:__'  THEN '0' || substr(Table2.time, 1, 1) || substr(Table2.time, 3, 2) || substr(Table2.time, 6, 2)
       END AS T2Key
FROM Table1
JOIN Table2 ON Table1.Key = T2Key
ORDER BY Date,
         Time