Für MySQL verwenden die Armen generate_series des Menschen, die über Ansichten erfolgt. MySQL ist die einzige RDBMS unter big four, die jede CTE Funktion nicht hat.
Eigentlich kann man diese Technik auf Datenbank verwenden, die Ansicht unterstützt. Also das ist so gut wie alle Datenbank
Generator-Technik hier gelesen: http://use-the-index-luke.com/blog/2011-07-30/mysql-row-generator#mysql_generator_code
Die einzige kleine Modifikation ich gemacht ist, wir ersetzen die bitweise (Verschiebung nach links und bit- oder) -Technik aus der ursprünglichen Technik mit bloßer Vermehrung und Ergänzung jeweils; wie Sql Server und Oracle hat keine Verschiebung nach links Betreiber.
Diese Abstraktion ist zu 99% garantiert auf alle Datenbank zu arbeiten, außer Oracle; Oracle SELECT
kann ohne Tabelle nicht funktionieren kann, um dies zu tun, von der Dummy-Tabelle braucht man, um zu wählen, vorausgesetzt, Oracle eine bereits, es DUAL
Tabelle genannt wird. Datenbankportabilität wird ein Rohr Traum :-)
Hier die abstrahierten Ansichten ist, die auf allen RDBMS arbeiten, ohne bitweise Operationen (die ohnehin in diesem Szenario nicht wirklich eine Notwendigkeit ist) und Feature-Nuancen (wir entfernen OR REPLACE
auf CREATE VIEW
, nur Postgresql und MySQL unterstützt sie) unter allen wichtigen Datenbank.
Oracle Einschränkung: Einfach FROM DUAL
nach jedem SELECT
Ausdruck
CREATE VIEW generator_16
AS SELECT 0 n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL
SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL
SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL
SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL
SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL
SELECT 15;
CREATE VIEW generator_256
AS SELECT ((hi.n * 16) + lo.n) AS n
FROM generator_16 lo, generator_16 hi;
CREATE VIEW generator_4k
AS SELECT ((hi.n * 256) + lo.n) AS n
FROM generator_256 lo, generator_16 hi;
CREATE VIEW generator_64k
AS SELECT ((hi.n * 256) + lo.n) AS n
FROM generator_256 lo, generator_256 hi;
CREATE VIEW generator_1m
AS SELECT ((hi.n * 65536) + lo.n) AS n
FROM generator_64k lo, generator_16 hi;
Dann diese Abfrage verwenden:
SELECT t.value, t.cnt, i.n
FROM tbl t
JOIN generator_64k i
ON i.n between 1 and t.cnt
order by t.value, i.n
Postgresql: http://www.sqlfiddle.com/#!1/1541d/1
Oracle: http://www.sqlfiddle.com/#!4/26c05/1
SQL Server: http://www.sqlfiddle.com/#!6/84bee/1
MySQL: http://www.sqlfiddle.com/#!2/78f5b/1
Ich mag diese Antwort am besten, weil sie tragbar ist. – cygri
Diese Antwort hat mir geholfen, ein großes Problem in unseren Abfragen zu lösen, und mir geholfen, eine ganze Reihe neuer Berichte mit diesem Code zu erstellen. Ich wünschte, ich könnte mehr tun als nur diese Antwort zu wählen. :) – Neels