0

我有以下架构,仅显示相关列:

表 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 通行证
4

1 回答 1

0

你应该考虑GROUP BY

    WHERE meta.attrName='timestamp' 
    GROUP BY metaval
    ORDER BY configname, metaval;

或使用您不希望在组中重复的列

于 2013-08-31T16:26:04.517 回答