Ответ 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;
Есть ли какой-либо синтаксис подзапроса 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, но буду интересоваться другими базами данных, которые могли бы сделать что-то подобное.
Я предполагаю, что вы можете сделать подзапрос с несколькими 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;
Вы можете сделать это в PostgreSQL:
=> 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
В стандартном 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).
В Microsoft T-SQL 2008 формат:
SELECT a, b FROM (VALUES (1, 2), (3, 4), (5, 6), (7, 8), (9, 10) ) AS MyTable(a, b)
т.е. как упоминал Джонатан, но без ключевого слова "таблица".
См:
Я нашел эту ссылку Временные таблицы с 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....
Подробнее: http://dev.mysql.com/doc/refman/5.0/en/create-table.html
(внизу)
Это имеет то преимущество, что при возникновении проблемы с заполнением таблицы (несоответствие типа данных) таблица автоматически отбрасывается.
Ранний ответ использовал предложение FROM SELECT. Если это возможно, используйте это, потому что он сохраняет головную боль при очистке стола.
Недостаток (который может не иметь значения) с FROM SELECT - это то, насколько большой созданный набор данных. Временная таблица позволяет индексировать, что может быть критическим. Для последующего запроса. Кажется контр-интуитивным, но даже с набором данных среднего размера (~ 1000 строк), может быть быстрее иметь индекс, созданный для запроса для работы.
Одним словом, да. Еще лучше ИМО, если ваш 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 тыс. Строк), потому что она настолько полезна вообще.