【问题标题】:Select from table rows that match all items in a where in list从与 where in list 中的所有项目匹配的表行中选择
【发布时间】:2021-09-14 11:38:32
【问题描述】:

我有一个 5 字段表,我想做一个这样的 qry:

SELECT *
FROM dbo.table
WHERE somefield in (90,120,30,90)

问题是我在表的行中有几个 90、120 和 30 值,但我只想返回符合条件的前 4 行。

有什么简单的方法可以做到这一点吗?我在 SQL Server 2008 上。

CREATE TABLE ForgeRock
    ([id] int, [somefield] int)
;

INSERT INTO ForgeRock
    ([id], [somefield])
VALUES
    (1, 90),
    (2, 90),
    (3, 120),
    (4, 30),
    (5, 30),
    (6, 90),
    (7, 10),
    (8, 20),
    (9, 90),
    (10, 30),
    (11, 20)
;

Fidle with data and query。 预期结果将是90,120,20,90 和他们尊敬的ids。

【问题讨论】:

  • 样本数据和预期结果将帮助我们帮助您。此外,SQL Server 2008 已经完全不受支持 2 年(几乎到今天);您现在应该真的正在考虑升级路径。
  • @user1228825 小提琴应该补充问题/答案,但不是必需的。使用 edit 功能将 DDL 和 DML 放入您的问题中,而不是在 cmets 中摆弄。
  • “将 DDL 和 DML 放在你的问题中” @user1228825 不是 只是指向小提琴的超链接.. .
  • 对我来说,您问题中的链接也已损坏,所以它真的没有帮助。同样,样本数据和预期结果将帮助我们为您提供帮助。
  • 如果你把它复制过去就很奇怪!

标签: sql sql-server sql-server-2008


【解决方案1】:

您是按列表过滤的,in 只是检查每个输入值的成员资格。因此,列表中值的序数位置无关紧要,它仅用于过滤。要区分相同值的两个不同实例,您需要将此列表转换为表格或进行其他一些保存订单信息的转换。

一种方式可以是table value constructor

with flt as (
  select
    val,
    row_number() over(partition by val order by val) as rn /*To distinguish instances of the value*/
  from(values (90),(120),(30),(90)) as t(val)
)
, base as (
  select
    f.*,
    row_number() over(partition by somefield order by id) as rn
  from ForgeRock as f
  where somefield in (select flt.val from flt) /*To restrict input before row number*/
)
select b.*
from base as b
  join flt
    /*Match value AND repetition*/
    on b.somefield = flt.val
      and b.rn = flt.rn
id somefield rn
4 30 1
1 90 1
2 90 2
3 120 1

对于现代版本,也有openjson 的可能性,如果您从外部收到此列表:

with flt as (
  select
    [value] as val,
    row_number() over(partition by [value] order by [key]) as rn /*To distinguish instances of the value*/
  from openjson('[90, 120, 30, 90]') as t
)
...
the same code

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 2016-09-27
    • 2021-09-07
    • 2015-07-07
    • 2014-10-30
    相关资源
    最近更新 更多