Frage MySQL "WITH" -Klausel


Ich versuche, MySQL zu verwenden, um eine Sicht mit der Klausel "WITH" zu erstellen

WITH authorRating(aname, rating) AS
   SELECT aname, AVG(quantity)
   FROM book
   GROUP BY aname

Aber MySQL scheint dies nicht zu unterstützen.

Ich dachte, das wäre ziemlich Standard und ich bin sicher, Oracle unterstützt dies. Gibt es irgendwie, um MySQL zu zwingen, die "WITH" -Klausel zu verwenden? Ich habe es mit der MyISAM- und innoDB-Engine versucht. Beide funktionieren nicht.


75
2017-11-28 01:43


Ursprung


Antworten:


Update: MySQL 8.0 erhält endlich die Funktion allgemeiner Tabellenausdrücke, einschließlich rekursiver CTEs.

Hier ist ein Blog, der es ankündigt: http://mysqlserverteam.com/mysql-8-0-labs-recursive-common-table-expressions-in-mysql-ctes/

Unten ist meine frühere Antwort, die ich ursprünglich 2008 geschrieben habe.


MySQL unterstützt keine Abfragen mit dem WITH Syntax in SQL-99 definiert, auch genannt Gemeinsame Tabellenausdrücke.

Dies ist seit Januar 2006 eine Feature-Anforderung für MySQL: http://bugs.mysql.com/bug.php?id=16244

Andere RDBMS-Produkte, die allgemeine Tabellenausdrücke unterstützen:

Andere Datenbanken, die keine Unterstützung für die WITH-Klausel haben (Stand Februar 2014):


87
2017-11-28 07:49



Sie könnten sich für etwas wie dieses interessieren:

select * from (
    select * from table
) as Subquery

12
2018-02-11 21:07



Sie haben die Syntax richtig:

WITH AuthorRating(AuthorName, AuthorRating) AS
   SELECT aname         AS AuthorName,
          AVG(quantity) AS AuthorRating
   FROM Book
   GROUP By Book.aname

Wie andere bereits erwähnt haben, unterstützt MySQL diesen Befehl nicht. WITH wurde in SQL: 1999 hinzugefügt; Die neueste Version des SQL-Standards ist SQL: 2008. Sie können weitere Informationen zu Datenbanken finden, die SQL: 1999 verschiedene Funktionen unterstützen Wikipedia.

MySQL ist traditionell etwas hinter dem SQL-Standard zurückgeblieben, während kommerzielle Datenbanken wie Oracle, SQL Server (kürzlich) und DB2 ihnen ein wenig näher gekommen sind. PostgreSQL ist typischerweise auch ziemlich standardkonform.

Vielleicht möchten Sie sich die Roadmap von MySQL ansehen. Ich bin mir nicht ganz sicher, ob diese Funktion unterstützt wird, eignet sich jedoch hervorragend zum Erstellen von lesbaren Rollup-Abfragen.


11
2018-05-14 17:07



Oracle unterstützt WITH.

Es würde so aussehen.

WITH emps as (SELECT * FROM Employees)
SELECT * FROM emps WHERE ID < 20
UNION ALL
SELECT * FROM emps where Sex = 'F'

@ysth WITH ist schwer zu googlen, weil es ein allgemeines Wort ist, das normalerweise von Suchen ausgeschlossen wird.

Du würdest dir das ansehen wollen Dokumente auswählen um zu sehen, wie Unterabfrage-Factoring funktioniert.

Ich weiß, dass dies das OP nicht beantwortet, aber ich beseitige jede Verwirrung, die vielleicht begonnen hat.


5
2017-11-28 02:15



Hast du jemals versucht Temporäre Tabelle? Das hat meine Konvente gelöst:

create temporary table abc (
column1 varchar(255)
column2 decimal
);
insert into abc
select ...
or otherwise
insert into abc
values ('text', 5.5), ('text2', 0815.8);

Dann können Sie diese Tabelle in jeder Auswahl in dieser Sitzung verwenden:

select * from abc inner join users on ...;

1
2018-02-26 08:53



Aufbauend auf der Antwort von @Mosty Mostacho, können Sie hier etwas Ähnliches in MySQL tun, um festzustellen, welche Einträge in einer Tabelle nicht vorhanden sind und sich nicht in einer anderen Datenbank befinden.

select col1 from (
   select 'value1' as col1 union
   select 'value2' as col1 union
   select 'value3' as col1
) as subquery
left join mytable as mytable.mycol = col1
where mytable.mycol is null
order by col1

Möglicherweise möchten Sie einen Texteditor mit Makrofunktionen verwenden, um eine Liste von Werten in die in Anführungszeichen gesetzte Vereinigungsklausel zu konvertieren.


1
2017-10-31 23:44



MariaDB unterstützt jetzt WITH. MySQL ist für jetzt nicht. https://mariadb.com/kb/en/mariadb/with/


0
2018-06-11 07:25