Gibt es eine SQL-Unterabfragesyntax, mit der Sie eine temporäre Tabelle buchstäblich definieren können?
Zum Beispiel so etwas wie
SELECT
MAX(count) AS max,
COUNT(*) AS count
FROM
(
(1 AS id, 7 AS count),
(2, 6),
(3, 13),
(4, 12),
(5, 9)
) AS mytable
INNER JOIN someothertable ON someothertable.id=mytable.id
Dies würde das Ausführen von zwei oder drei Abfragen ersparen: Erstellen einer temporären Tabelle, Einfügen von Daten und anschließende Verwendung in einem Join.
Ich benutze MySQL, wäre aber an anderen Datenbanken interessiert, die so etwas tun könnten.
Ich nehme an, Sie könnten eine Unterabfrage mit mehreren SELECT
name__s in Kombination mit UNION
name__s durchführen.
SELECT a, b, c, d
FROM (
SELECT 1 AS a, 2 AS b, 3 AS c, 4 AS d
UNION ALL
SELECT 5 , 6, 7, 8
) AS temp;
Sie können es in PostgreSQL tun:
=> select * from (values (1,7), (2,6), (3,13), (4,12), (5,9) ) x(id, count);
id | count
----+-------
1 | 7
2 | 6
3 | 13
4 | 12
5 | 9
In Standard-SQL (SQL 2003 - siehe http://savage.net.au/SQL/ ) können Sie Folgendes verwenden:
INSERT INTO SomeTable(Id, Count) VALUES (1, 7), (2, 6), (3, 13), ...
Mit etwas mehr Nachholbedarf können Sie auch Folgendes verwenden:
SELECT * FROM TABLE(VALUES (1,7), (2, 6), (3, 13), ...) AS SomeTable(Id, Count)
Ob diese in MySQL funktionieren, ist ein separates Problem. Sie können jedoch jederzeit darum bitten, sie hinzuzufügen, oder sie selbst hinzufügen (das ist das Schöne an Open Source).
In Microsoft T-SQL 2008 lautet das Format:
SELECT a, b FROM (VALUES (1, 2), (3, 4), (5, 6), (7, 8), (9, 10) ) AS MyTable(a, b)
Das heißt wie Jonathan oben erwähnt, aber ohne das Schlüsselwort 'table'.
Sehen:
Ich fand diesen Link Temporäre Tabellen mit MySQL
CREATE TEMPORARY TABLE TempTable ( ID int, Name char(100) ) TYPE=HEAP;
INSERT INTO TempTable VALUES( 1, "Foo bar" );
SELECT * FROM TempTable;
DROP TABLE TempTable;
CREATE TEMPORARY TABLE (ID int, Name char (100)) SELECT ....
Weitere Informationen finden Sie unter: http://dev.mysql.com/doc/refman/5.0/de/create-table.html
(in der Nähe des Bodens)
Dies hat den Vorteil, dass bei Problemen mit dem Auffüllen der Tabelle (Datentypenkonflikt) die Tabelle automatisch gelöscht wird.
Bei einer frühen Antwort wurde eine FROM SELECT-Klausel verwendet. Wenn möglich, verwenden Sie das, weil es die Kopfschmerzen erspart, den Tisch aufzuräumen.
Der Nachteil (der möglicherweise keine Rolle spielt) bei FROM SELECT ist, wie groß der erstellte Datensatz ist. Eine temporäre Tabelle ermöglicht eine Indizierung, die kritisch sein kann. Für die nachfolgende Abfrage. Scheint nicht intuitiv zu sein, aber selbst bei einem mittelgroßen Datensatz (~ 1000 Zeilen) kann es schneller sein, einen Index zu erstellen, damit die Abfrage ausgeführt werden kann.
In einem Wort ja. Noch besseres IMO, wenn Ihr SQL-Produkt allgemeine Tabellenausdrücke (CTEs) unterstützt, d. H. Einfacher für das Auge als die Verwendung einer Unterabfrage, und derselbe CTE kann mehrmals verwendet werden, z. So erstellen Sie eine Sequenztabelle mit eindeutigen Ganzzahlen zwischen 0 und 999 in SQL Server 2005 und höher:
WITH Digits (nbr) AS
(
SELECT 0 AS nbr 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
),
Sequence (seq) AS
(
SELECT Units.nbr + Tens.nbr + Hundreds.nbr
FROM Digits AS Units
CROSS JOIN Digits AS Tens
CROSS JOIN Digits AS Hundreds
)
SELECT S1.seq
FROM Sequence AS S1;
mit der Ausnahme, dass Sie tatsächlich etwas Nützliches mit der Sequenztabelle tun würden, z. Analysieren Sie die Zeichen aus einer VARCHAR-Spalte in einer Basistabelle.
Wenn Sie jedoch diese Tabelle verwenden, die nur aus Literalwerten besteht, mehrfach oder in mehreren Abfragen, warum sollten Sie sie dann nicht zu einer Basistabelle machen? Jede Datenbank, die ich verwende, hat eine Sequenztabelle mit ganzen Zahlen (normalerweise 100 KB Zeilen), weil sie im Allgemeinen so nützlich ist.