2016-06-06 7 views
0

Ich habe eine MySQL 5.6-Ansicht, die eine Union benötigt. Ich habe hier auf Stack Overflow gelesen, dass es einen Serverfehler gibt, der die Vereinigung in einer Ansicht verwendet. Die Lösung besteht darin, Klammern aus dem from zu entfernen. Ich habe das gemacht, aber es funktioniert nicht und ich hoffte, dass jemand mir irgendwie helfen kann, an dem Käfer vorbeizukommen.MySQL-Ansicht mit Union funktioniert nicht nach Fehler beheben

Ich habe 2 Tabellen ordersuccess und orderfailure. Die Ansicht berechnet einen Prozentsatz des Erfolgs für diesen Zeitraum. Der Zeitraum ist alle 15m, 4 pro Stunde, 15,30,45,00. Hier ist Schema, beide sind gleich. Eine Zählung von 0 wird der Tabelle nicht hinzugefügt. Ein Nullwert kann 0 oder 100 sein, abhängig von der ifnull-Anweisung.

+---------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | dtime | datetime | NO | PRI | NULL | | | counter | bigint(20) | NO | | NULL | | | rate | bigint(20) | YES | | NULL | | +---------+------------+------+-----+---------+-------+

Ich habe einen Kalender-Tabelle in die Lücken zu füllen, wenn nichts während eines Zeitraums gemeldet wird. Es hat nur Datum/Uhrzeit für jeden Zeitraum. Hier ist Kalender Tabelle;

+-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | dtime | datetime | NO | PRI | NULL | | +-------+----------+------+-----+---------+-------+

Hier ist die Abfrage, um die richtigen Daten zurück.

Ich muss mehrere Ansichten machen, weil in der from-Klausel ausgewählt hat. Hier ist meine create Ansicht für diese Abfrage. Ich entfernte alle Klammern, die ich konnte. Habe ich etwas übersehen oder gibt es eine bessere Möglichkeit, die Anfrage zu schreiben?

CREATE ALGORITHM=UNDEFINED [email protected] SQL SECURITY DEFINER VIEW d61_14521 AS select '1000591' AS id, c.dtime AS dtime, 0 AS rate, ifnull(p.percent,100) AS counter from calendar c left join d61p2_14521 p on c.dtime = p.dtime;

CREATE ALGORITHM=UNDEFINED [email protected] SQL SECURITY DEFINER VIEW d61P2_14521 AS select '1000591' AS id, c.dtime AS dtime, '0' AS rate, ifnull(p.percent,100) AS counter
from d61P3_14521 union d61P6_14521 where c.dtime < now();

CREATE ALGORITHM=UNDEFINED [email protected] SQL SECURITY DEFINER VIEW d61P3_14521 AS select ifnull(f.dtime,s.dtime) as dtime, ifnull(ifnull(s.counter,0)/(ifnull(s.counter,0) + ifnull(f.counter,0)) * 100,100) as percent from d61P4_14521 s right join d61P5_14521 f on s.dtime=f.dtime ;

CREATE ALGORITHM=UNDEFINED [email protected] SQL SECURITY DEFINER VIEW d61P4_14521 AS select * from OrderSummarySuccess_14521 where id = 1000591 ;

CREATE ALGORITHM=UNDEFINED [email protected] SQL SECURITY DEFINER VIEW d61P5_14521 AS select * from OrderSummaryFailure_14521 where id = 1000591;

CREATE ALGORITHM=UNDEFINED [email protected] SQL SECURITY DEFINER VIEW d61P6_14521 AS select ifnull(f.dtime,s.dtime) as dtime, ifnull(ifnull(s.counter,0)/(ifnull(s.counter,0) + ifnull(f.counter,0)) * 100,100) as percent from d61P4_14521 s left join d61P5_14521 f on s.dtime=f.dtime ;

Ich erstelle die Ansichten in dieser Reihenfolge. Sie haben Erfolg bis d61P2_14521.

  1. d61P4_14521
  2. d61P5_14521
  3. d61P6_14521
  4. d61P3_14521
  5. d61P2_14521

Die Ansicht, dass ist d61P2_14521 ausfällt. Hier ist der Fehler.

mysql> CREATE ALGORITHM=UNDEFINED [email protected] SQL SECURITY DEFINER -> VIEW d61P2_14521 AS select -> '1000591' AS id, -> c.dtime AS dtime, -> '0' AS rate, -> ifnull(p.percent,100) AS counter -> from -> d61P3_14521 -> union -> d61P6_14521 -> where c.dtime < now(); ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'vod61P6_14521 where c.dtime < now()' at line 10

+0

Union ist für Select-Anweisungen, nicht Joins. es ist 'select ... UNION select ...'. doing 'select ... join foo UNION bar' ist illegal/unmöglich. –

+0

Ich habe die gleiche Syntax in der Arbeitsabfrage verwendet und die Abfrage funktioniert. es ist der einzige Weg, wie ich eine vollständige äußere Verbindung in MySQL machen kann. – dean

+0

nein, hast du nicht. In deiner "arbeitenden" Abfrage hast du 'select ... union select ...'.Nur weil eine Ansicht eine gespeicherte Auswahl ist, bedeutet das nicht, dass Sie den Namen der Ansicht anstelle einer Auswahl verwenden. –

Antwort

1

Bis MySQL 5.7.7 können Sie keine Unterabfragen in from-Klauseln (oder Mitmach-Klauseln) einer Ansicht. Sie müssen diese Unterabfragen also in separaten Ansichten verschieben. Ihre Abfrage kann (nach ein wenig Aufräumen) in zwei Ansichten aufgeteilt werden:

create viewSubqueryFullOuterJoin as 
    select 
    ifnull(f.dtime,s.dtime) as dtime, 
    ifnull(ifnull(s.counter,0)/(ifnull(s.counter,0) 
     + ifnull(f.counter,0)) * 100,100) as percent 
    from OrderSummarySuccess_14521 s 
    right join OrderSummaryFailure_14521 f 
    on s.id = 1000591 and f.id = 1000591 and s.dtime=f.dtime 
union 
    select 
    ifnull(f.dtime,s.dtime) as dtime, 
    ifnull(ifnull(s.counter,0)/(ifnull(s.counter,0) 
     + ifnull(f.counter,0)) * 100,100) as percent 
    from OrderSummarySuccess_14521 s 
    left join OrderSummaryFailure_14521 f 
    on s.id = 1000591 and f.id = 1000591 and s.dtime=f.dtime 
order by dtime; -- 'order by' might belong in viewQueryWithSubquery 

create viewQueryWithSubquery as 
select 
    '1000591' AS `id`, 
    `c`.`dtime` AS `dtime`, 
    '0' AS `rate`, 
    ifnull(`p`.`percent`,100) AS `counter` 
from `calendar` `c` 
left join viewSubqueryFullOuterJoin `p` 
on `c`.`dtime` = `p`.`dtime` 
where `c`.dtime < now();