0

2 つのテーブルがあります。簡略化したバージョンを示します。最初のテーブルから正確な一致を見つけようとしています.2番目のテーブルにエントリの正確なリストがあります(結合テーブルの複数の個々のレコードが最初のテーブルの主キーと一致するため)。

Table Metrics:

MetricsId:  (primary key)
A: (some parameter)
B: (some parameter)
C: (some parameter)

このような:

MetricsId    A    B    C
-------------------------- 
    1       0.5  0.2  3.5 
    2       0.1  0.1  4.5 
    3       1.1  1.0  3.0


TABLE Metrics_Grid:
MetricsId (foreign key to Metrics
GridId (foreign key to another table)

MetricsId   GridId
---------------------
   1           12
   1           13
   1           14
   1           15
   2           12
   3           13

メトリック テーブルのレコードは、特定のパラメーターおよび特定のグリッド セットに対して生成されたメトリックを表します。2 番目のテーブルは、グリッドのリストを含むテーブルですが、そのメトリック レコードに含まれる各グリッドのレコードがあります。1 つのグリッドを複数のリストに含めることができます (たとえば、1 つのグリッドのメトリックがあり、エントリがあり、そのメトリック エントリがリンク テーブルに 1 つしかない場合、単一のグリッド (実際には、メトリクスが実行されるたびに、各個人、次にグループのメトリクス レコードがあります)

私がする必要があるのは、パラメーターの正確な一致とグリッドのリストが既にデータベースにある場合を見つけ、その一致を返すか、何も返さないことです。したがって、次のような一致を見つける必要があります。

開始するには、一致する必要がある正確な gridID のリストがあります (これは、Spring JdbcTemplate を使用して Java でコーディングされているため、必要な形式でリストを渡すことができます)

Select M.* from Metrics M
Where
A=? AND B=? AND C=?
AND 
EXISTS (SELECT MG.GridId From MetricsGrid MG where MG.MetricsId=M.MetricsId) 
** This is where I get lost **
AND <THE LIST OF THE THE GridsIds matches exactly the list I have>

私は間違っていたことをいくつか試しましたが、なぜ間違っていたのかはわかっています。たとえば、次のように、grid_id を持つメトリクス レコードがすべて返されたため、1 つではなく複数の値が得られました。

たとえば、A=0.5、B=0.2、c=3.5 AND GridIds = (12, 13, 14, 15) に一致する Metrics レコードを要求できるようにしたい、または同様に、同じパラメーターに一致する Metrics レコード、ただし、GridId 12 のみ

私の試みは常にすべてのレコードを返します。Group By を使用してみました.. Count() を使用しましたが、正しく取得できませんでした。これは難しいことではなく、頭が固まっているだけだと思います。

似たようなものは見つけられませんでしたが、一般的なものでしょうか?

洞察をありがとう。

4

2 に答える 2

0

これを試して:

SELECT m.metricsid, m.a, m.b, m.c
FROM metrics as m
INNER JOIN metrics_grid as mg on m.metricsid = mg.metricsid
WHERE m.a = ?
AND m.b = ?
AND m.c = ?
AND mg.gridid IN (?, ?, ?)
AND NOT EXISTS (SELECT MG2.GridId FROM Metrics_grid MG2 WHERE M.MetricId=MG2.MetricsId AND MG2.SensorID NOT IN (?,?,?))

ma、mb、mc、および mg.gridid にインデックスがあることを確認してください。

于 2012-08-28T19:24:56.037 に答える
0

以下のクエリを使用して、必要な結果を取得できるはずです。手順は次のとおりです。

  1. MetricsIds必要なものとまったく同じものを検索しGridIdsます。DISTINCTGROUP BYWHEREおよびを使用してこれを行うことができますHAVING

    まずMetricsIds、リストから gridId を持つものをすべて選択します。

    個別のコマンドで重複を削除します。

    次に、group by を実行して、各 の gridIds の数を数えますMetricsId

    4 つの特定の gridId を探しているとします。そのため、HAVINGコマンドを使用して他の結果を除外します。

  2. テーブルからMetricsIdsの正しい基準を持つものをすべて検索します。A,B,CMetrics

  3. inner join前のステップの結果の間に実行する

    SELECT m.MetricsId from Metrics AS m join
        (SELECT DISTINCT mg.MetricsId, COUNT(mg.GridId) AS cnt FROM Metrics_Grid AS mg
    WHERE GridId in (12,13,14,15)
    GROUP BY mg.MetricsId) AS k ON m.MetricsId = k.MetricsId
    WHERE m.A =0.5 AND m.B = 0.2 AND m.C=3.5;
    
于 2012-08-28T21:30:01.520 に答える