选择行的次数与SQL Server中WHERE中提到的次数相同

时间:2014-09-14 11:51:51

标签: sql sql-server select where-clause

在我看来,展示我的意思的最好方法是举个例子:

我的查询是:

SELECT * FROM myTABLE WHERE myColumn IN ('a','b','c','d','a','a','b') ORDER BY myColumn ASC

结果是:

  • 一个
  • B'/ LI>
  • C
  • d

但我希望他们成为:

  • 一个
  • 一个
  • 一个
  • B'/ LI>
  • B'/ LI>
  • C
  • d

有没有办法实现我的目标?

2 个答案:

答案 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这是非标准的,但更简洁。

Example SQLFiddle