スキーマが非常に奇妙であるのは事実ですが、SQL Server 2005以降を使用している場合は、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
ここでの本当の利点は、さまざまなコードを1か所で処理するだけでよいことです。たとえばCode6を追加する場合は、UNPIVOTに追加するだけで、コードに組み込まれます。
また、これは「学生はコードに2つの連続した1が必要」というより一般的な要件を解決するだけであることに注意してください。生徒が1をいくつ持っているかを確認したり、2つの値がどこにあるかを気にしたりすることはありません。
最後の注意点は、ROW_NUMBER()関数は、コードがギャップなしで順番に名前が付けられていることを前提としているため、Code7からCode9に移行する場合、これら2つは「連続的」であると想定することです。