Frage

In MySQL 5.0 warum die folgenden Fehler auftreten, wenn eine Ansicht mit einer Unterabfrage in dem FROM-Klausel zu erstellen versuchen?

  

ERROR 1349 (HY000): Blick SELECT enthält eine Unterabfrage in der FROM-Klausel

Ist dies eine Einschränkung der MySQL-Engine, warum haben sie nicht diese Funktion noch nicht umgesetzt?

Auch, was sind einige gute Abhilfen für diese Einschränkung?

Gibt es Workarounds, die für jede Unterabfrage in der FROM-Klausel arbeiten oder gibt es einige Abfragen, die nicht ohne die Verwendung einer Unterabfrage in der FROM-Klausel ausgedrückt werden kann?


Ein Beispiel query (wurde in einem Kommentar begraben):

SELECT temp.UserName 
FROM (SELECT u1.name as UserName, COUNT(m1.UserFromId) as SentCount 
      FROM Message m1, User u1 
      WHERE u1.uid = m1.UserFromId 
      Group BY u1.name HAVING SentCount > 3 ) as temp
War es hilfreich?

Lösung

kann nicht die Abfrage in Ihrem Kommentar nur geschrieben werden als:

SELECT u1.name as UserName from Message m1, User u1 
  WHERE u1.uid = m1.UserFromID GROUP BY u1.name HAVING count(m1.UserFromId)>3

Das auch mit den bekannten Geschwindigkeitsproblemen mit Unterabfragen in MySQL helfen soll

Andere Tipps

Ich hatte das gleiche Problem. Ich wollte einen Blick zeigen Information des letzten Jahres aus einer Tabelle mit Datensatz von 2009 bis 2011. Hier ist die ursprüngliche Abfrage erstellen:

SELECT a.* 
FROM a 
JOIN ( 
  SELECT a.alias, MAX(a.year) as max_year 
  FROM a 
  GROUP BY a.alias
) b 
ON a.alias=b.alias and a.year=b.max_year

Gliederung der Lösung:

  1. Erstellen Sie eine Ansicht für jede Unterabfrage
  2. ersetzen Unterabfragen mit diesen Ansichten

Hier ist die Lösung Abfrage:

CREATE VIEW v_max_year AS 
  SELECT alias, MAX(year) as max_year 
  FROM a 
  GROUP BY a.alias;

CREATE VIEW v_latest_info AS 
  SELECT a.* 
  FROM a 
  JOIN v_max_year b 
  ON a.alias=b.alias and a.year=b.max_year;

Es funktioniert gut auf MySQL 5.0.45, ohne viel von einer Geschwindigkeit Strafe (im Vergleich zur Ausführung die ursprüngliche Unter Abfrage wählen ohne Views).

Es scheint ein bekanntes Problem zu sein.

http://dev.mysql.com/doc/ refman / 5.1 / de / unbenannte-views.html

http://bugs.mysql.com/bug.php?id=16757

Viele IN Abfragen können als (links außen) neu geschrieben werden, schließt sich und ein (nicht) NULL irgendeiner Art. zum Beispiel

SELECT * FROM FOO WHERE ID IN (SELECT ID FROM FOO2)

als neu geschrieben werden

SELECT FOO.* FROM FOO JOIN FOO2 ON FOO.ID=FOO2.ID

oder

SELECT * FROM FOO WHERE ID NOT IN (SELECT ID FROM FOO2)

kann sein

SELECT FOO.* FROM FOO 
LEFT OUTER JOIN FOO2 
ON FOO.ID=FOO2.ID WHERE FOO.ID IS NULL

für jede Unterabfrage eine Ansicht erstellen ist der Weg zu gehen. Got es wie ein Zauber funktioniert.

Sie können dieses Problem umgehen, indem eine separate Ansicht für jede Unterabfrage Erstellen Sie verwenden möchten, und dann auf die in der Ansicht kommen Sie erstellen. Hier ein Beispiel: http://blog.gruffdavies.com/2015/01/25/a-neat-mysql-hack-to-create-a-view-with-subquery-in-the-from-clause/

Das ist ganz praktisch, da Sie sehr wahrscheinlich, es trotzdem wieder verwenden wollen und helfen Sie, Ihre SQL trocken zu halten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top