Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL重用子查询_Mysql_Sql_Stored Procedures_Subquery - Fatal编程技术网

MySQL重用子查询

MySQL重用子查询,mysql,sql,stored-procedures,subquery,Mysql,Sql,Stored Procedures,Subquery,我在这里读了一些关于子查询重用的文章,但没有找到一个满意的答案:假设下表temp(在MySQL中): 我想生成一个新的列X,它将V从M为0的行复制到具有相同Y(ear)的所有行中,例如: 可以这样做: SELECT Y, M, V, (SELECT V FROM temp WHERE temp.Y = t.Y AND M = 0) AS X FROM temp t; SELECT temp.Y, temp.M, temp.V, q2.V AS X FROM temp JOIN (SELEC

我在这里读了一些关于子查询重用的文章,但没有找到一个满意的答案:假设下表temp(在MySQL中):

我想生成一个新的列X,它将V从M为0的行复制到具有相同Y(ear)的所有行中,例如:

可以这样做:

SELECT Y, M, V,
  (SELECT V FROM temp WHERE temp.Y = t.Y AND M = 0) AS X
FROM temp t;
SELECT temp.Y, temp.M, temp.V, q2.V AS X
FROM temp
JOIN (SELECT * FROM temp WHERE M = 0) q2 USING (Y);
或者像这样:

SELECT Y, M, V,
  (SELECT V FROM temp WHERE temp.Y = t.Y AND M = 0) AS X
FROM temp t;
SELECT temp.Y, temp.M, temp.V, q2.V AS X
FROM temp
JOIN (SELECT * FROM temp WHERE M = 0) q2 USING (Y);
在本练习中,可以假设temp每个Y(ear)只包含一个M=0

问题是,temp实际上不是一个表,而是一个复杂查询的结果。用实际的查询替换temp是不方便的,而且性能可能会很差,除非MySQL足够聪明,能够检测到这两个结构是相同的

如果MySQL中没有WITH子句,是否有一种方法可以生成X而无需引用temp两次;i、 这个问题真的需要子查询吗


代码最终将在S-PROC中运行,因此我可以创建一个临时内存表,但我想知道是否有更优雅的解决方案。

公共表表达式和子查询是最简单的方法。视图是一种解决方案。另一种方法是使用变量:

select t.*,
       (@v := if(@y = y, @v,
                 if(@y := y, v, v)
                )
       )
from temp t cross join
     (select @y := 0, @v := -1) params
order by year, (m = 0) desc;

注意,此公式强烈假设每年至少有一个值
m=0
——它复制了该年所有行中每年遇到的第一个值。您可以在问题描述中指定这一点。表达式可以变得更复杂一些,以涵盖一年中没有这样一行的情况(但这将是一个不同的问题)。

正如您所发现的,mysql不支持常用的表表达式。您试图通过嵌套的子查询实现的内容可能是什么。视图是否有帮助,它不是表,但在Queriesshx中扮演一个角色。我对观点的经验有限。不确定他们是否可以接受变量,因为复杂的查询是参数驱动的。Thx,这是有效的,而且看起来很有希望,因为temp只出现一次。我需要弄清楚到底发生了什么:-)顺便说一句,顺序对这个问题不是必要的。@Matthias<代码>orer by是逻辑工作所必需的。它需要先找到给定年份的
m=0
,然后再找到该年份的
m
的其他值。很高兴知道,thx Gordon。顺便说一句,物理顺序产生了前导m=0的有序y,但情况可能并非总是如此,这对于其他人重新使用这个优雅的解决方案很重要。(仍然没有弄清楚为什么会这样,因为我需要调整它以适应实际问题,我需要匹配的不仅仅是Y,而且必须从M=0行复制多个V(值):-)