0

我有 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

指标表中的记录表示为特定参数和一组特定网格生成的指标。第二个表是包含网格列表的表,但每个网格都有一条记录,该记录包含在该度量记录中。单个网格可以在多个列表中(例如,假设您有单个网格的指标,它会有一个条目,并且该指标条目在链接表中只有一个,那么您可能有一组网格的指标,包括单个网格(实际上每个人都有指标记录,然后是一组,每次运行指标时)

我需要做的是找到完全匹配的参数和网格列表何时已经在数据库中,并返回一个匹配项或什么都不返回。所以我需要找到这样的匹配:

首先,我有需要匹配的确切 gridID 的列表(这是用 java 编码的,使用 Spring JdbcTemplate,所以我可以以我需要的任何形式传入列表)

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 的指标记录,所以我得到了多个而不是一个。

因此,例如,我希望能够要求匹配 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 的。

    使用 distinct 命令删除重复项。

    然后做一个 group by 并计算每个 gridIds 的数量MetricsId

    假设您正在寻找 4 个特定的 gridId,因此您可以使用该HAVING命令过滤掉其他结果。

  2. 搜索所有MetricsIds具有正确条件的A,B,Cfrom Metricstable。

  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 回答