2013-04-09 38 views
2

我需要比较同一列中的行,所以我有以下mysql查询哪些运作良好给予预期的结果。mysql改进与子查询查看

SELECT x.aord, 
     x.anode AS parent, 
     x.bnode AS child 
FROM (SELECT a.ordinal    AS aord, 
       a.id_dt_graph_node_edge AS aid, 
       a.id_dt_graph_node  AS anode, 
       b.ordinal    AS bord, 
       b.id_dt_graph_node_edge AS bid, 
       b.id_dt_graph_node  AS bnode 
     FROM dt_graph_node_edge a 
       JOIN dt_graph_node_edge b 
       ON a.ordinal < b.ordinal) x 
     LEFT JOIN (SELECT a.ordinal    AS aord, 
         a.id_dt_graph_node_edge AS aid, 
         a.id_dt_graph_node  AS anode, 
         b.ordinal    AS bord, 
         b.id_dt_graph_node_edge AS bid, 
         b.id_dt_graph_node  AS bnode 
        FROM dt_graph_node_edge a 
         JOIN dt_graph_node_edge b 
          ON a.ordinal < b.ordinal) y 
       ON x.aord = y.aord 
       AND x.bord > y.bord 
WHERE y.bord IS NULL 
ORDER BY x.aord, 
      x.bord 

我发现由于错误#1349,无法在此查询上创建视图。任何人都可以提出一个更好的方法来做出这样的查询,特别关注速度,实际上这个查询是非常缓慢的。谢谢。

+0

请为此声明发布'EXPLAIN'。 (发布=更新您的问题) – Kermit 2013-04-09 02:53:09

回答

0

您无法在查询中创建VIEW的原因是它包含一个子查询。根据文档,VIEW不能在SELECT查询中包含子查询。解决方法是创建在子查询VIEW第一,例如

CREATE VIEW firstSubquery 
AS 
SELECT a.ordinal    AS aord, 
     a.id_dt_graph_node_edge AS aid, 
     a.id_dt_graph_node  AS anode, 
     b.ordinal    AS bord, 
     b.id_dt_graph_node_edge AS bid, 
     b.id_dt_graph_node  AS bnode 
FROM dt_graph_node_edge a 
     JOIN dt_graph_node_edge b 
     ON a.ordinal < b.ordinal; 

CREATE VIEW secondSubquery 
AS 
SELECT a.ordinal    AS aord, 
     a.id_dt_graph_node_edge AS aid, 
     a.id_dt_graph_node  AS anode, 
     b.ordinal    AS bord, 
     b.id_dt_graph_node_edge AS bid, 
     b.id_dt_graph_node  AS bnode 
FROM dt_graph_node_edge a 
     JOIN dt_graph_node_edge b 
     ON a.ordinal < b.ordinal; 

,并加入新创建VIEW当前查询,

CREATE VIEW finalVIEW 
AS 
SELECT x.aord, 
     x.anode AS parent, 
     x.bnode AS child 
FROM firstSubquery x 
     LEFT JOIN secondSubquery y 
       ON x.aord = y.aord AND x.bord > y.bord 
WHERE y.bord IS NULL 
ORDER BY x.aord, x.bord 

PS:在MySQL的看法是可怕的

+0

感谢它按预期工作。 – datelligence 2013-04-09 21:11:31

+0

你的回答是对的。是的,MySQL没有选项来创建一个包含子查询的视图。这是处理这种情况的间接方式。 – Raja 2014-10-28 08:17:51