简体   繁体   中英

How to create table with multiple rows and columns using only SELECT clause (i.e. using SELECT without FROM clause)

I know that in SQL Server, one can use SELECT clause without FROM clause, and create a table with one row and one column

SELECT 1 AS n;

But I was just wondering, is it possible to use SELECT clause without FROM clause, to create

  1. a table with one column and multiple rows

  2. a table with multiple columns and one row

  3. a table with multiple columns and multiple rows

I have tried many combinations such as

SELECT VALUES(1, 2) AS tableName(n, m);

to no success.

You can do it with CTE and using union (Use union all if you want to display duplicates)

  • One Column and multiple rows

     with tbl1(id) as (select 1 union all select 2) select * from tbl1; 
  • One row and multiple columns

     with tbl2(id,name) as (select 1,'A') select * from tbl2; 
  • Multiple columns and multiple rows

     with tbl3(id,name) as (select 1,'A' union all select 2,'B') select * from tbl3; 
-- One column, multiple rows.
select 1 as ColumnName union all select 2; -- Without FROM;
select * from ( values ( 1 ), ( 2 ) ) as Placeholder( ColumnName ); -- With FROM.

-- Multiple columns, one row.
select 1 as TheQuestion, 42 as TheAnswer; -- Without FROM.
select * from ( values ( 1, 42 ) ) as Placeholder( TheQuestion, TheAnswer ); -- With FROM.

-- Multiple columns and multiple rows.
select 1 as TheQuestion, 42 as TheAnswer union all select 1492, 12; -- Without FROM.
select * from ( values ( 1, 2 ), ( 2, 4 ) ) as Placeholder( Column1, Column2 ); -- With FROM.

You can do all that by using UNION keyword

create table tablename as select 1 as n,3 as m union select 2 as n,3 as m

In Oracle it will be dual:

create table tablename as select 1 as n,3 as m from dual union select 2 as n,3 as m from dual

You can use UNION operator:

CREATE TABLE AS SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;

The UNION operator selects only distinct values by default. To allow duplicate values you can use UNION ALL.
The column names in the result-set are usually equal to the column names in the first SELECT statement in the UNION.

try this:

--1) a table with one column and multiple rows
select * into tmptable0 from(
select 'row1col1' as v1
union all
select 'row2col1' as v1
) tmp

--2) a table with multiple columns and one row
select  'row1col1' as v1, 'row1col2' as v2 into tmptable1

--3) a table with multiple columns and multiple rows
select * into tmptable2 from(
select 'row1col1'  as v1, 'row1col2' as v2 
union all
select 'row2col1' as v2, 'row2col2' as v2 
) tmp

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM