Использование Microsoft SQL Server здесь.Учитывая это (кластеризованный индекс на два столбца):
use tempdb;
CREATE TABLE mytemp
(
N1 INT NOT NULL,
N2 INT NOT NULL,
PRIMARY KEY (N1, N2)
);
INSERT mytemp (N1, N2)
SELECT N1.number, N2.number
FROM (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) AS N1(number)
CROSS JOIN (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) AS N2(number)
Как я могу получить значения после n1 = 5, n2 = 6 (при заказе по n1, n2)?У меня есть следующая попытка.
declare @n1boundary int = 5;
declare @n2boundary int = 6;
SELECT N1, N2
FROM mytemp
WHERE N1 = @n1boundary AND N2 > @n2boundary
OR N1 > @n1boundary
ORDER BY N1, N2
Это дает мне результаты, которые я хочу, но синтаксис кажется неуклюжим, и он выполняет два сканирования.Мне кажется, что теоретически, это должно быть возможно сделать с помощью одного сканирования.
[Редактировать] Сканирования, на которые я смотрю, это те, о которых сообщается, когда SET STATISTICS IO установлен на ON:
Table 'mytemp'. Scan count 2, logical reads 4