我有以下架构,仅显示相关列:
表 1 - 元信息 属性名 属性值 实例 ID 表 2 - PrimaryData 属性名 属性值 元实例 ID 表 3 - 审计数据 结果 元实例 ID
在 Metainfo 中,一行是 attrName='timestamp' 和 attrValue='2012-01-01 12:00:01'。像这样的多行具有不同的时间戳,因此具有不同的 instanceId。该表还包含我们对我的问题不感兴趣的其他元信息,例如主机名。
我的查询基于此时间戳属性。我想通过唯一的时间戳将所有 3 个表连接在一起。我首先尝试了这个:
SELECT meta.attrValue AS metaval, p.attrName AS configname, p.attrValue AS configvalue,
a.result AS auditresult FROM Metainfo meta
INNER JOIN PrimaryData p
ON meta.instanceId = p.metaInstanceId
INNER JOIN AuditData a
ON meta.instanceId = a.metaInstanceId
WHERE meta.attrName='timestamp'
ORDER BY configname, metaval;
我认为这给了我重复的结果,因为 Metainfo 到 PrimaryData 是多对多关系,然后与 AuditData 连接的结果表最终导致更加毛茸茸的多对多关系。所以我尝试了这个:
SELECT m.attrValue AS metaval, p.attrName AS configname, p.attrValue AS configvalue,
a.result AS auditresult FROM Metainfo m, PrimaryData p, AuditData a
WHERE m.attrName='timestamp' AND
m.instanceId=p.metaInstanceId=a.metaInstanceId
ORDER BY configname, metaval;
我不明白为什么这仍然给我重复。我想我是说,“从处理时间戳元信息的 3 个表中获取单个列,然后首先按配置名称对它们进行分组,然后按时间戳分组”。
***表元信息:*** *attrName attrValue instanceId* 主机 https://www.site1.com 1 时间戳 2013-08-02 16:04:20.142 1 主机 https://www.site2.com 2 时间戳 2013-08-05 01:00:11.001 2 主机 https://www.site3.com 3 时间戳 2013-08-05 02:09:01.782 3 **表主要数据:** *attrName attrValue metaInstanceId* 端口号 80 1 服务器名称 pegasus 1 使用中 F 1 端口号 400 2 serverName 大力神 2 使用中 T 2 端口号 4040 3 服务器名称巨像 3 使用中 T 3 **表审计数据** *结果 metaInstanceId* 通过 1 通过 1 失败 1 通过 2 通过 2 通过 2 失败 3 通过 3 通过 3
AuditData 中的每一行都告诉我们 PrimaryData 中的配置是通过还是未通过某些测试。有 3 个配置测试了 3 次,这就是 PrimaryData 和 AuditData 有 9 行的原因。这些表中的每一个都有我没有显示的列,以使事情变得更容易。我想要一个提供时间戳值、配置名称、配置值和结果的查询。因此,在显示的示例数据中,此查询将导致:
timestampVal configName configValue 结果 2013-08-02 16:04:20.142 端口号 80 通过 2013-08-05 01:00:11.001 端口号 400 通过 2013-08-05 02:09:01.782 端口号 4040 失败 2013-08-02 16:04:20.142 serverName pegasus Pass 2013-08-05 01:00:11.00 serverName hercules Pass 2013-08-05 02:09:01.782 serverName colossus Pass 2013-08-02 16:04:20.142 inUse F 失败 2013-08-05 01:00:11.001 使用 T 通行证 2013-08-05 02:09:01.782 使用 T 通行证