Подтвердить что ты не робот

Можете ли вы определить "буквальные" таблицы в SQL?

Есть ли какой-либо синтаксис подзапроса SQL, который позволяет в буквальном смысле определить временную таблицу?

Например, что-то вроде

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

Это избавит вас от необходимости выполнять два или три запроса: создать временную таблицу, поместить в нее данные, а затем использовать ее в соединении.

Я использую MySQL, но буду интересоваться другими базами данных, которые могли бы сделать что-то подобное.

4b9b3361

Ответ 1

Я предполагаю, что вы можете сделать подзапрос с несколькими SELECT в сочетании с UNION s.

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;

Ответ 3

В стандартном SQL (SQL 2003 - см. http://savage.net.au/SQL/) вы можете использовать:

INSERT INTO SomeTable(Id, Count) VALUES (1, 7), (2, 6), (3, 13), ...

С немного большей погоней вы также можете использовать:

SELECT * FROM TABLE(VALUES (1,7), (2, 6), (3, 13), ...) AS SomeTable(Id, Count)

Независимо от того, работают ли они в MySQL, это отдельная проблема, но вы всегда можете попросить ее добавить или добавить ее самостоятельно (что красота Open Source).

Ответ 5

Я нашел эту ссылку Временные таблицы с 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

CREATE TEMPORARY TABLE (ID int, Name char (100)) SELECT....

Подробнее: http://dev.mysql.com/doc/refman/5.0/en/create-table.html

(внизу)

Это имеет то преимущество, что при возникновении проблемы с заполнением таблицы (несоответствие типа данных) таблица автоматически отбрасывается.

Ранний ответ использовал предложение FROM SELECT. Если это возможно, используйте это, потому что он сохраняет головную боль при очистке стола.

Недостаток (который может не иметь значения) с FROM SELECT - это то, насколько большой созданный набор данных. Временная таблица позволяет индексировать, что может быть критическим. Для последующего запроса. Кажется контр-интуитивным, но даже с набором данных среднего размера (~ 1000 строк), может быть быстрее иметь индекс, созданный для запроса для работы.

Ответ 7

Одним словом, да. Еще лучше ИМО, если ваш SQL-продукт поддерживает общие табличные выражения (CTE), то есть проще на глазу, чем использование подзапроса плюс один и тот же CTE может использоваться несколько раз, например. это "создать" таблицу последовательностей уникальных целых чисел от 0 до 999 в SQL Server 2005 и выше:

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;

за исключением того, что вы действительно сделаете что-то полезное в таблице Sequence, например. проанализируйте символы из столбца VARCHAR в базовой таблице.

ОДНАКО, если вы используете эту таблицу, которая состоит только из буквенных значений, нескольких раз или в нескольких запросах, то почему бы не сделать ее базовой таблицей в первую очередь? Каждая база данных, которую я использую, имеет таблицу последовательностей целых чисел (обычно 100 тыс. Строк), потому что она настолько полезна вообще.