我有以下架构,只显示相关列:
Table 1 - Metainfo attrName attrValue instanceId Table 2 - PrimaryData attrName attrValue metaInstanceId Table 3 - AuditData result metaInstanceId
在Metainfo中,一行是attrName ='timestamp',attrValue ='2012-01-01 12:00:01'。这样有多行具有不同的时间戳,因此具有不同的instanceIds。该表包含我们对我的问题不感兴趣的其他元信息,如主机名。
我的查询基于此时间戳属性。我想通过独特的时间戳加入所有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;
我不明白为什么这个STILL会给我重复。我想我是说,“从3个表中获取处理时间戳元数据的各个列,然后按配置名称,然后按时间戳将它们分组”。
***TABLE Metainfo:*** *attrName attrValue instanceId* host https://www.site1.com 1 timestamp 2013-08-02 16:04:20.142 1 host https://www.site2.com 2 timestamp 2013-08-05 01:00:11.001 2 host https://www.site3.com 3 timestamp 2013-08-05 02:09:01.782 3 **TABLE PrimaryData:** *attrName attrValue metaInstanceId* portNum 80 1 serverName pegasus 1 inUse F 1 portNum 400 2 serverName hercules 2 inUse T 2 portNum 4040 3 serverName colossus 3 inUse T 3 **TABLE AuditData** *result metaInstanceId* Pass 1 Pass 1 Fail 1 Pass 2 Pass 2 Pass 2 Fail 3 Pass 3 Pass 3
AuditData中的每一行都告诉我们PrimaryData中的配置是否通过了某些测试。有3次配置测试3次,这就是为什么PrimaryData和AuditData有9行。这些表中的每一个都有我未显示的列,以使事情变得更容易。我想要一个查询,它给我时间戳值,配置名称,配置值和结果。因此,在显示的示例数据中,此查询将导致:
timestampVal configName configValue result 2013-08-02 16:04:20.142 portNum 80 Pass 2013-08-05 01:00:11.001 portNum 400 Pass 2013-08-05 02:09:01.782 portNum 4040 Fail 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 Fail 2013-08-05 01:00:11.001 inUse T Pass 2013-08-05 02:09:01.782 inUse T Pass
答案 0 :(得分:0)
你应该考虑GROUP BY
WHERE meta.attrName='timestamp'
GROUP BY metaval
ORDER BY configname, metaval;
或使用您不希望在
组中重复的列