在我看来,展示我的意思的最好方法是举个例子:
我的查询是:
SELECT * FROM myTABLE WHERE myColumn IN ('a','b','c','d','a','a','b') ORDER BY myColumn ASC
结果是:
但我希望他们成为:
有没有办法实现我的目标?
答案 0 :(得分:2)
您需要使用join
而非where
子句执行此操作:
with vals as (
select 'a' as val union all
select 'b' union all
select 'c' union all
select 'd' union all
select 'a' union all
select 'a' union all
select 'b'
)
select t.*
from myTable t join
vals
on t.myColumn = vals.val;
通常,where
子句不能增加结果集中的行数。它用于过滤。
编辑:
有些人可能会认为使用带有values子句的cross apply
更容易:
select t.*
from myTable t join
(values ('a'), ('b'), ('c'), ('d'), ('a'), ('a'), ('b')
) vals(val)
on t.myColumn = vals.val;
我对“哪个更简单"”没有强烈的意见。更多数据库支持union all
表单。
答案 1 :(得分:2)
在使用SQL Server时,可以使用values
将数据构建为行。然后,您可以加入主表,而不是相反。
select
t.*
from (values
('a'), ('b'), ('c'), ('d'), ('a'), ('a') , ('b')
) as x(myColumn)
inner join
mytable t
on t.myColumn = x.myColumn
order by
t.myColumn;
编辑后,这与Gordon的答案相同,除了使用values
这是非标准的,但更简洁。