web-dev-qa-db-fra.com

Comment sélectionner plusieurs lignes SQL codées en dur?

Si vous exécutez cette requête

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

le résultat sera une sélection d'une ligne avec deux colonnes ayant ces valeurs: 

test-a1, test-a2

Comment puis-je modifier la requête ci-dessus pour avoir une sélection avec plusieurs lignes, par exemple.

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

Je sais comment faire cela avec UNION mais j’estime qu’il existe un moyen plus simple de le faire.

PS. Désolé pour une question aussi fondamentale, il est très difficile de google.

39
Eugene

UNION ALL est le meilleur choix. C'est plus rapide que UNION et vous aurez des lignes mutuellement exclusives.

18
HLGEM
SELECT 'test-a1' AS name1, 'test-a2' AS name2 
UNION ALL 
SELECT 'test-b1', 'test-b2'
UNION ALL 
SELECT 'test-c1', 'test-c2'
34
openshac

Le mot-clé Values ​​peut être utilisé comme ci-dessous.

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

Extension de la réponse de @openshac pour Oracle, car le code mentionné ci-dessous fonctionne pour 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
5
Alok Chaudhary

Vous pouvez utiliser une table temporaire, la remplir avec vos résultats, puis la sélectionner

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;

Cela va retourner

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

J'aimerais entendre si quelqu'un a une meilleure solution. Dans le passé, j'ai utilisé ceci:

Select top 3 'Hardcode'
from tableWithLotsOfRows

Souhaitez-vous changer d'abc, avec 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

cela devrait retourner quelque chose comme:

TestA1, Test-B1
TestA2, Test-B2
TestA3, Test-B3
2
TizzyFoe

dans MySQL, vous pouvez utiliser l'union

select * from 
    (select 2006 as year union
     select 2007 as year union
     select 2008
    ) as years
0
vencedor