it-swarm.com.de

Können Sie "Literal" -Tabellen in SQL definieren?

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.

48
thomasrutter

Ich nehme an, Sie könnten eine Unterabfrage mit mehreren SELECTname__s in Kombination mit UNIONname__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;
49
Blixt

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

http://www.postgresql.org/docs/8.2/static/sql-values.html

21
dvv

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).

16

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:

13
Pete

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;
6
ole6ka

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.

0
Pat

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.

0
onedaywhen