我正在查询存储在数据库中的一些系统日志,不幸的是,供应商在根据表关系创建数据库结构方面做得很差。我通常用于此类事情的报告工具依赖于标准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
我不确定这是否可能,但如果是的话,我希望有人知道。
思想?
答案 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