虽然您的架构确实非常非常奇怪,但假设您使用的是 SQL Server 2005 或更高版本,您可以使用 UNPIVOT 轻松解决它。请注意,您必须将所有代码的硬编码列表提供给 unpivot ...
WITH pvt (student, code, value) as (
SELECT
Student,
ROW_NUMBER()OVER(Partition By Student Order By Codes) as CodeId,
Value
FROM
( select * from students ) P
UNPIVOT (
Value FOR Codes IN (Code1, Code2, Code3, Code4, Code5)
) Code
)
select
distinct
pvt.student
from
pvt
inner join pvt p2
on p2.code = pvt.code + 1
and p2.student = pvt.student
where
pvt.value = 1 and p2.value = 1
这里真正的优势是您只需在一个地方处理各种代码 - 例如,如果您添加 Code6,您只需将其添加到 UNPIVOT 中,它将被合并到代码中。
另请注意,这只是解决了“学生在代码中必须有 2 个连续的 1”这一更一般的要求。它不检查学生有多少个 1,也不关心 2 值落在哪里。
最后一个警告是 ROW_NUMBER() 函数假设您的代码是按顺序命名的,没有间隙,所以如果您从 Code7 转到 Code9,它只会假设这两个是“连续的”。