Итак, у меня есть простая таблица с именем temp, которую можно создать с помощью:
CREATE TABLE temp (value int, id int not null primary key);
INSERT INTO temp
VALUES(0,1),
(0,2),
(0,3),
(0,4),
(1,5),
(1,6),
(1,7),
(1,8);
У меня есть вторая таблица temp2, которую можно создать с помощью:
CREATE TABLE temp (value int, id int);
INSERT INTO temp
VALUES(0,1),
(0,2),
(0,3),
(0,4),
(1,5),
(1,6),
(1,7),
(1,8);
Единственное отличиеМежду temp и temp2 поле id является первичным ключом temp, а temp2 не имеет первичного ключа.Я не уверен, как, но я получаю разные результаты со следующим запросом:
select * from temp
where id in (
select id
from (
select id, ROW_NUMBER() over (partition by value order by value) rownum
from temp
) s1
where rownum = 1
)
Это результат для temp:
value id
----------- -----------
0 1
0 2
0 3
0 4
1 5
1 6
1 7
1 8
, и это то, что я получаю, когдаtemp заменяется на temp2 ( ПРАВИЛЬНЫЙ РЕЗУЛЬТАТ ):
value id
----------- -----------
0 1
1 5
При выполнении самого внутреннего запроса (s1) извлекаются ожидаемые результаты:
id rownum
----------- --------------------
1 1
2 2
3 3
4 4
5 1
6 2
7 3
8 4
Когда я просто выполняю запрос оператора in
в обоих случаях, я также получаю ожидаемый результат:
id
-----------
1
5
Я не могу понять, в чем причина этого.Это ошибка?
Примечания: temp2 был создан с простым select * into temp2 from temp
.Я использую SQL Server 2008. Мои извинения, если это известный сбой.Это трудно найти, так как для этого требуется оператор in
.«Эквивалентный» запрос, использующий объединение , действительно дает правильные результаты для обеих таблиц.
Редактировать: dbfiddle показывает различия: Неожиданные результаты Ожидаемые результаты