优化类似的MySQL子查询

优化类似的MySQL子查询,mysql,query-optimization,Mysql,Query Optimization,这是我在一个更大的SQL脚本中的一个子查询。它在多个不同的CASE语句中执行相同的操作,所以我希望我能以某种方式组合该操作,这样它就不必反复执行相同的操作。但是,如果将orderby命令移到CASE语句之外,则无法获得正确的结果 我在JDAY上加入了两个表,met_data和flexgridlayers_表。Flexgridlayers_表中有JDAY和Segment字段,在这个简单的示例中,met_数据有JDAY、TAIR和TDEW字段,但实际上有更多字段。我通过Matlab运行它,所以var

这是我在一个更大的SQL脚本中的一个子查询。它在多个不同的CASE语句中执行相同的操作,所以我希望我能以某种方式组合该操作,这样它就不必反复执行相同的操作。但是,如果将orderby命令移到CASE语句之外,则无法获得正确的结果


我在JDAY上加入了两个表,met_data和flexgridlayers_表。Flexgridlayers_表中有JDAY和Segment字段,在这个简单的示例中,met_数据有JDAY、TAIR和TDEW字段,但实际上有更多字段。我通过Matlab运行它,所以variable1和variable2是由嵌套循环设置的值。我需要使用CASE语句来解释variable1不等于1的情况,然后我想要输出0。否则,我想查找对应于JDAY连接的值,但这些值可能与F.JDAY和M.JDAY中的值不完全匹配。我想在最接近的上匹配,然后我会写如下。。。看起来您正在寻找每个JDAY一个TAIR和TDEW。如果是这种情况,请根据年份条件和F vs M JDay值对met_数据表应用一次左联接。现在,通常情况下,这将在每个JDay返回多行

SELECT 
      PQ.JDay,
      PQ.MaxJDayPerFDay,
      CASE WHEN *var1* <> 1 THEN 0 ELSE M2.TAIR END TAIR,
      CASE WEHN *var1* <> 1 THEN 0 ELSE M2.TDEW END TDEW
   from 
      ( SELECT 
              F.JDay,
              MAX( M.JDAY ) as MaxJDayPerFDay
           from 
              FlexGridLayers_Table F
                 JOIN met_Data M
                    ON M.Year = 2000
                    AND F.JDay >= M.JDay
           where
              F.Segment = *var2* 
           group by
              F.JDay ) PQ 
         JOIN Met_Data M2 
            on M2.Year = 2000 
            AND PQ.MaxJDayPerFDay = M2.JDay
现在,通过在met_数据中应用MAX JDay一次并按JDay分组来执行预查询,因此它将始终每个F.JDay返回一条记录。因此,现在有一个查询预先限定为F。Segment=variable 2。如果希望从F表中获得其他列,请根据需要将它们放入此预查询PQ别名中

然后,该结果可以立即连接回met_数据表,因为一天值现在可以从预查询中明确知道。因此,您现在可以一次获得TAIR和TDEW值,而不是对每个记录应用两个单独的查询


希望这有意义,如果没有,请告诉我。

此查询需要32秒,有5个子查询,*variable1*=1。我不知道还能从你的链接中得到什么…请发布一个关于这个查询的解释。实际上,你能发布整个查询,并进一步说明var1和var2的上下文是基于哪里的吗。。。循环,从一个循环到另一个循环,什么…整个查询大约有400行长…这只是一小段。我在一个网格中循环,认为X和Y坐标…variable1可以被认为是Y,variable2可以被认为是X。这两个变量的嵌套循环通过连续整数循环,命中每个网格点,起点和终点由用户根据其系统的几何体设置。非常好!计算时间从32秒减少到2秒…不错!我甚至没想过用“群交”来。。。
flexgridlayers_table:
Segment  JDAY
2        1.5
2        2.5
2        3.5
3        1.5
3        2.5
3        3.5

met_data:
JDAY  Year  TAIR  TDEW
1.0   2000  7     8
1.1   2000  9     10
1.6   2000  11    12
2.5   2000  13    14
2.6   2000  15    16
3.4   2000  17    18
4.0   2000  19    20
JDAY  TAIR  TDEW
1.5   9     10
2.5   13    14
3.5   17    18  
SELECT 
      PQ.JDay,
      PQ.MaxJDayPerFDay,
      CASE WHEN *var1* <> 1 THEN 0 ELSE M2.TAIR END TAIR,
      CASE WEHN *var1* <> 1 THEN 0 ELSE M2.TDEW END TDEW
   from 
      ( SELECT 
              F.JDay,
              MAX( M.JDAY ) as MaxJDayPerFDay
           from 
              FlexGridLayers_Table F
                 JOIN met_Data M
                    ON M.Year = 2000
                    AND F.JDay >= M.JDay
           where
              F.Segment = *var2* 
           group by
              F.JDay ) PQ 
         JOIN Met_Data M2 
            on M2.Year = 2000 
            AND PQ.MaxJDayPerFDay = M2.JDay