Mysql 如何选择几个硬编码的SQL行?

Mysql 如何选择几个硬编码的SQL行?,mysql,sql,oracle,Mysql,Sql,Oracle,如果执行此查询 SELECT 'test-a1' AS name1, 'test-a2' AS name2 结果将是一行选择,其中两列具有以下值: test-a1, test-a2 如何修改上述查询,使其具有多行选择,例如 test-a1, test-a2 test-b1, test-b2 test-c1, test-c2 我知道如何与工会合作,但我觉得有一个更简单的方法可以做到这一点 顺便说一句,很抱歉问了这么一个基本的问题,用谷歌搜索是很困难的。UNION ALL是最好的选择。它比UN

如果执行此查询

SELECT 'test-a1' AS name1, 'test-a2' AS name2
结果将是一行选择,其中两列具有以下值:

test-a1, test-a2
如何修改上述查询,使其具有多行选择,例如

test-a1, test-a2
test-b1, test-b2
test-c1, test-c2
我知道如何与工会合作,但我觉得有一个更简单的方法可以做到这一点


顺便说一句,很抱歉问了这么一个基本的问题,用谷歌搜索是很困难的。

UNION ALL是最好的选择。它比UNION更快,而且您将拥有相互排斥的行。

我很想听到的是,任何人都有更好的解决方案。在过去,我曾使用过:

Select top 3 'Hardcode'
from tableWithLotsOfRows
你介意把abc换成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
这将返回类似于:

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

您可以使用临时表,将结果填入其中,然后从中进行选择

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;
这会回来的

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

Values关键字可按如下方式使用

select * from 
(values ('test-a1', 'test-a2'), ('test-b1', 'test-b2'), ('test-c1', 'test-c2')) x(col1, col2)
扩展适用于oracle的代码,因为下面提到的代码适用于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
在MySQL中,您可以这样使用:

SELECT * from 
    (SELECT 2006 AS year UNION
     SELECT 2007 AS year UNION
     SELECT 2008 AS year UNION
    ) AS years

从MySQL 8.0.19开始,可以执行以下操作

SELECT column_0 AS name1, column_1 AS name2 FROM (VALUES ROW('test-a1','test-a2'), ROW('test-b1','test-b2'), ROW('test-c1','test-c2') ) AS hardcodedNames 挑选 列0作为名称1, 列_1作为名称2 从…起 (价值观 第行(‘测试-a1’、‘测试-a2’), 第行(‘测试-b1’、‘测试-b2’), 第行(‘测试-c1’、‘测试-c2’) )作为硬编码的名字 返回

name1 name2 ================== test-a1 test-a2 test-b1 test-b2 test-c1 test-c2 姓名1姓名2 ================== 测试-a1测试-a2 测试b1测试b2 测试-c1测试-c2 关于列名的注记

从值输出的表的列具有隐式命名的列column_0、column_1、column_2等,始终以0开头


此处的文档:。

以下代码适用于我在MSSQL环境中的工作:

SELECT Name1,Name2 FROM(VALUES  ('test-a1', 'test-a2'),
                                   ('test-b1', 'test-b2'),
                                   ('test-c1', 'test-c2'))AS Test(Name1,Name2)
输出:

Name1   Name2
------- -------
test-a1 test-a2
test-b1 test-b2
test-c1 test-c2

这是一个MySQL问题,因此没有排名函数。但是好主意!那太糟糕了。在t-sql中,我滥用了超行数()。您有表可供选择吗?您不想使用union有什么原因吗?是否有大量的值?是否有理由认为UNION ALL答案优于此答案?此代码段无法在MuSQL 5.6.25中运行。这是5.7中的一项新功能吗?这个示例在MS SQL Server中对我来说效果很好,但在Oracle中效果不好。以下是Oracle的答案,它对我的帮助最大(请注意,还有一个字符串而不是数字的解决方案,请看我的评论):不需要最终的联合
Name1   Name2
------- -------
test-a1 test-a2
test-b1 test-b2
test-c1 test-c2