2011-06-14 45 views
34

Si se ejecuta esta consulta¿Cómo seleccionar varias filas SQL codificadas?

SELECT 'test-a1' AS name1, 'test-a2' AS name2 

el resultado será una fila de selección con dos columnas que tienen estos valores:

test-a1, test-a2 

¿Cómo puedo modificar la consulta anterior para tener una selección con varios filas, por ejemplo

test-a1, test-a2 
test-b1, test-b2 
test-c1, test-c2 

Sé cómo hacer esto con UNION, pero creo que existe una forma más sencilla de hacerlo.

PS. Perdón por una pregunta tan básica, es muy difícil googlearla.

+0

¿Tiene una mesa para elegir? – openshac

+0

¿Hay alguna razón por la que no desee usar la unión? ¿Hay una gran cantidad de valores? – NullRef

Respuesta

17

UNION ALL es la mejor opción. Es más rápido que UNION y tendrá filas mutuamente excluyentes.

2

Me encantaría saber si alguien tiene una mejor solución. En el pasado he usado esto:

Select top 3 'Hardcode' 
from tableWithLotsOfRows 

¿Te importaría cambiar abc, con 123?

select top 3 
    'test-A'+convert(varchar, row_number() over (order by PrimaryKey)), 
    'test-B'+convert(varchar, row_number() over (order by PrimaryKey)) 
from tableWithLotsOfRows 

que debe devolver algo como:

TestA1, Test-B1 
TestA2, Test-B2 
TestA3, Test-B3 
+0

Es una pregunta de MySQL, por lo que no hay funciones de clasificación. Pero buena idea! –

+1

Eso apesta. En t-sql abuso mucho de row_number(). – TizzyFoe

26
SELECT 'test-a1' AS name1, 'test-a2' AS name2 
UNION ALL 
SELECT 'test-b1', 'test-b2' 
UNION ALL 
SELECT 'test-c1', 'test-c2' 
2

Se puede utilizar una tabla temporal, llenarlo con sus resultados y luego seleccione de ella

create table #tmpAAA (name1 varchar(10), name2 varchar(10)) 
insert into #tmpAAA (name1, name2) 
values ('test_a', 'test_b'), 
     ('test_c', 'test_d'), 
     ('test_e', 'test_f'), 
     ('test_g', 'test_h'), 
     ('test_i', 'test_j'); 
select * from #tmpAAA; 

Esta voluntad return

name1 name2 
================== 
test_a test_b 
test_c test_d 
test_e test_f 
test_g test_h 
test_i test_j 
23

La palabra clave de los valores se puede utilizar como abajo.

select * from 
(values ('test-a1', 'test-a2'), ('test-b1', 'test-b2'), ('test-c1', 'test-c2')) x(col1, col2) 
+1

¿Hay alguna razón por la cual la respuesta UNION TODO sea preferida sobre esta? – svz

+4

Este fragmento de código no se puede ejecutar en MuSQL 5.6.25. ¿Es una nueva característica en 5.7? – HKTonyLee

+0

Este ejemplo funcionó bien en MS SQL Server para mí, pero no en Oracle. – Graeck

4

La extensión de la answer of @openshac para Oracle, como el código de abajo se menciona que funciona para Oracle:

SELECT 'test-a1' AS name1, 'test-a2' AS name2 from dual 
UNION ALL 
SELECT 'test-b1', 'test-b2' from dual 
UNION ALL 
SELECT 'test-c1', 'test-c2' from dual 
Cuestiones relacionadas