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