2013-04-09 60 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