関連する列のみが表示された次のスキーマがあります。
表 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 パス