Mysql: создать встроенную таблицу в операторе выбора? - PullRequest
14 голосов
/ 01 марта 2012

Есть ли способ в MySql создать встроенную таблицу для использования для объединения?

Что-то вроде:

SELECT LONG [1,2,3] as ID, VARCHAR(1) ['a','b','c'] as CONTENT

что бы вывести

|  ID  |  CONTENT  |
| LONG | VARCHAR(1)|
+------+-----------+
|   1  |    'a'    |
|   2  |    'b'    |
|   3  |    'c'    |

и что я мог бы использовать в соединении, как это:

SELECT 
  MyTable.*,
  MyInlineTable.CONTENT
FROM
  MyTable
  JOIN 
    (SELECT LONG [1,2,3] as ID, VARCHAR(1) ['a','b','c'] as CONTENT MyInlineTable)
  ON MyTable.ID = MyInlineTable.ID

Я понимаю, что могу сделать

SELECT 1,'a' UNION SELECT 2,'b' UNION SELECT 3,'c'

Но это кажется довольно злым

Я не хочу делать хранимую процедуру, потому что потенциально a, b, c могут меняться при каждом запросе, а также размер данных. Также хранимая процедура должна быть сохранена в базе данных, и я не хочу изменять базу данных только для этого. Взгляд это то же самое.

Что я действительно ищу, так это то, что делает SELECT 1,'a' UNION SELECT 2,'b' UNION SELECT 3,'c' с более приятным синтаксисом.

Ответы [ 2 ]

6 голосов
/ 26 мая 2014

Единственный способ, который я сейчас помню, это использование UNION или создание TEMPORARY TABLE и вставка этих значений в него.Вам подходит?


TEMPORARY_TABLE (проверено и работает):

Создание:

CREATE TEMPORARY TABLE MyInlineTable (id LONG, content VARCHAR(1) );

INSERT INTO MyInlineTable VALUES
(1, 'a'),
(2, 'b'),
(3, 'c');

Использование:

SELECT 
  MyTable.*,
  MyInlineTable.CONTENT
FROM
  MyTable
  JOIN 
    SELECT * FROM MyInlineTable;
  ON MyTable.ID = MyInlineTable.ID

TEMPORARY_TABLES время жизни (ссылка) :

Временные таблицы автоматическиудаляется при выходе из области видимости, если только они не были явно удалены с помощью DROP TABLE:

.

Все остальные локальные временные таблицы автоматически удаляются в концетекущий сеанс.

.

Глобальные временные таблицы автоматически удаляются, когда заканчивается сеанс, создавший таблицу, и все другие задачи перестают ссылаться на них.Связь между задачей и таблицей поддерживается только в течение жизни одного оператора Transact-SQL.Это означает, что глобальная временная таблица удаляется при завершении последнего оператора Transact-SQL, который активно ссылался на таблицу после завершения сеанса создания.

0 голосов
/ 01 марта 2012
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...