0

関連する列のみが表示された次のスキーマがあります。

表 1 - メタ情報
属性名
属性値
インスタンス ID

表 2 - PrimaryData
属性名
属性値
メタインスタンス ID

表 3 - 監査データ
結果
メタインスタンス ID

Metainfo では、1 つの行は 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 インスタンス ID*
ホスト 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
サーバー名 ペガサス 1
使用中 F 1
ポート番号 400 2
サーバー名ヘラクレス 2
使用中 T 2
ポート番号 4040 3
serverName コロッサス 3
使用中 T 3

**表の監査データ**
*結果メタインスタンス ID*
パス 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 portNum 80 パス
2013-08-05 01:00:11.001 portNum 400 パス
2013-08-05 02:09:01.782 portNum 4040 失敗
2013-08-02 16:04:20.142 サーバー名 ペガサス パス
2013-08-05 01:00:11.00 serverName ヘラクレス パス
2013-08-05 02:09:01.782 serverName colossus パス
2013-08-02 16:04:20.142 inUse F 失敗
2013-08-05 01:00:11.001 inUse T パス
2013-08-05 02:09:01.782 inUse T パス
4

1 に答える 1

0

検討する必要がありますGROUP BY

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

または、グループ化で重複させたくない列を使用します

于 2013-08-31T16:26:04.517 に答える