1

我知道这是不可能的。但如果可能的话,我想通过任何间接方法来实现这一点。

实际上我想在下面添加查询以查看哪个抛出错误,视图中不允许子查询。

select T1.Code,
       T1.month,
       T1.value,
       IfNull(T2.Value,0)+IfNull(T3.value,0) as value_begin

  from (select *,@rownum := @rownum + 1 as rownum
          from Table1 
          Join (SELECT @rownum := 0) r) T1
  left join (select *,@rownum1 := @rownum1 + 1 as rownum
               from Table1 
               Join (SELECT @rownum1 := 0) r) T2
    on T1.code = T2.code
   and T1.rownum = T2.rownum + 1
  left join (select *,@rownum2 := @rownum2 + 1 as rownum
               from Table1 
               Join (SELECT @rownum2 := 0) r) T3
    on T1.code = T3.code
   and T1.rownum = T3.rownum + 2
 Order by T1.Code,T1.rownum

所以,我想我会将 Sub 查询作为单独的视图,但这又会引发视图中不允许变量的错误。请帮助克服这种情况。

提前感谢

4

1 回答 1

1

您可以尝试使用三角形连接 + 计数的方法来分配行号。它可能在大型数据集上表现不佳,但您应该能够使用几个视图来实现所有内容(如果您认为除了视图之外没有其他方法可以做您想做的事情)。思路如下:

  1. 数据集在 条件下连接到自身master.key >= secondary.key,其中master是实际从中提取详细数据的实例,并且secondary是用于提供行号的同一表的另一个实例。

  2. 基于该条件,第一行将 mastersecondary一行连接,第二行与两行连接,第三行与三行连接,依此类推。

  3. 此时,您可以按主key列以及输出中需要的列对结果集进行分组(尽管在 MySQL 中仅按主键分组就足够了)。计算每组中的行数将为您提供相应的行号。

所以,如果有这样的表:

CREATE TABLE SomeTable (
  ID int,
  Value int
);

将行号分配给表的查询可能如下所示:

SELECT m.ID, m.Value, COUNT(*) AS rownum
FROM SomeTable AS m
INNER JOIN SomeTable AS s ON m.ID >= s.ID
GROUP BY m.ID, m.Value
;

由于您似乎想要自加入排名行集(并且两次),这将需要使用上述查询作为派生表,并且因为您还希望整个事物成为一个视图(它不允许子查询FROM 子句),您可能需要将排名查询定义为单独的视图:

CREATE RankingView AS
SELECT m.ID, m.Value, COUNT(*) AS rownum
FROM SomeTable AS m
INNER JOIN SomeTable AS s ON m.ID >= s.ID
GROUP BY m.ID, m.Value
;

并随后在主查询中引用该视图:

CREATE SomeOtherView AS
SELECT ...
FROM RankingView AS t1
LEFT JOIN RankingView AS t2 ON ...
...

这个 SQL Fiddle 演示展示了该方法及其用法。

关于您的特殊情况的注意事项。您的表可能需要在分区中分配行号,即每个不同的Code行组都需要自己的行号集。这意味着您的排名视图应指定加入条件,如下所示:

ON m.Code = s.Code AND m.Month >= s.Month

请注意,在这种情况下,月份假定每个Code. 如果不是这种情况,您可能首先需要创建一个视图,该视图将原始数据集分组Code, Month并对该视图而不是原始数据集进行排名。


*根据key.

于 2013-10-10T06:29:29.580 回答