SQL - как создать многострочный результат без исходной таблицы - PullRequest
1 голос
/ 08 мая 2009

В стандартном SQL есть способ сказать:

select mubmle as x from mumblemmble

И получите более одной строки результатов, как этот

 x
 _ 
 1
 2
 3

без создания временных таблиц? Я могу сделать это в SQL Server с помощью row_count (), если знаю, что в таблице достаточно строк, например:

  select row_number() over (order by x.SomeColumn) from 
(select top 24 SomeColumn from TableThatHasAtLeast24Rows) x

Но интересно, есть ли стандартный (менее глупый) способ сделать это.

Ответы [ 2 ]

5 голосов
/ 08 мая 2009

В MySQL.

нет стандартного пути и вообще нет пути.

В Oracle:

SELECT  *
FROM    dual
CONNECT BY
        level < n

В MS SQL:

WITH hier(row) AS
        (
        SELECT  1
        UNION ALL
        SELECT  row + 1
        FROM    hier
        WHERE   row < n
        )
SELECT  *
FROM    hier
OPTION (MAXRECURSION 0)

В PostgreSQL:

SELECT  *
FROM    generate_series (1, n)

Обратите внимание, что MS SQL, в отличие от Oracle, не может перенести стек рекурсии во временное табличное пространство, поэтому могут возникнуть проблемы при генерации больших наборов данных.

См. этот ответ для более подробной информации

1 голос
/ 08 мая 2009

Стандарт SQL 2003 определяет способ сделать это - однако, не все СУБД реализуют его:

<table value constructor> ::= VALUES <row value expression list>

<row value expression list> ::= <table row value expression>
                            [ { <comma> <table row value expression> }... ]

<row value expression> ::= 
         <row value special case>
     |   <explicit row value constructor>

<table row value expression> ::= 
         <row value special case>
     |   <row value constructor>

И, пройдя через множество других БНФ, вы можете найти:

<explicit row value constructor> ::= 
         <left paren> <row value constructor element> <comma>
                      <row value constructor element list> <right paren>
     |   ROW <left paren> <row value constructor element list> <right paren>
     |   <row subquery>

<row value constructor element list> ::= 
     <row value constructor element>
     [ { <comma> <row value constructor element> }... ]

<row value constructor element> ::= <value expression>

Что при переводе означает, что в некоторых контекстах вы можете использовать:

 VALUES (v1a, v1b, v1c), (v2a, v2b, v2c)

для создания табличного значения с двумя строками и тремя столбцами в каждой строке. Оператор INSERT - это то место, где вы можете использовать конструкцию. Другой - в предложении FROM оператора SELECT, хотя показ достаточно BNF для соединения точек занял бы больше места, чем SO рекомендует для ответа.

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