Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
rector Member Откуда: Киев Сообщений: 57 |
Нашел интересное. За сам запрос не пинайте - писал кто то давно и суть не в его красоте и правильности с точки зрения написания. Суть в результатах и сейчас хочу о них рассказать. запрос вида: SELECT distinct(SAPID), [NAME] FROM (SELECT rn=row_number() over (partition by [LOGIN] order by [code]) ,[code] ,[NAME] ,[LOGIN] ,[ISACTIVE] FROM USERS )as usr right join dbo.USER_DATA as s on 'DOMEN\'+s.[login]=usr.[login] where rn=1 and isactive='1' and code not like('sfa%') ORDER BY NAME таблица Users:
USER_DATA - это вьюха Результат простой - список пользователей. Было замечено, что пропускает одну запись, т.е. в результирующем наборе нет одного пользователя. Я бы все понял, но.... если преобразовать запрос следующим образом: SELECT distinct(SAPID), [NAME] FROM (SELECT rn=row_number() over (partition by [LOGIN] order by [code]) ,[code] ,[NAME] ,[LOGIN] ,[ISACTIVE] FROM USERS where name='UserName' )as usr right join dbo.USER_DATA as s on 'DOMEN\'+s.[login]=usr.[login] where rn=1 and isactive='1' and code not like('sfa%') ORDER BY NAME Тогда только пользователь появляется. Как такое может быть, что при введении нового ограничения появляются данные, которых нет в запросе без этого ограничения ? |
|||||||||||
17 сен 12, 15:14 [13176489] Ответить | Цитировать Сообщить модератору |
Mnior Member Откуда: Кишинёв Сообщений: 6723 |
SELECT * FROM (SELECT rn=row_number()over(partition by [LOGIN] order by [code]) FROM USERS) as usr where rn=1 А всё от того что есть более одного логина. PS: Уродски написанный запрос не даёт видеть 100500 ошибок или нормально его прочитать. |
||
17 сен 12, 15:23 [13176598] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47052 |
rector, элементарно! Из подзапроса во внешнем запросе остаются не все записи, а толлько под первым номером в группе по [LOGIN] Если не ограничивать по name, все записи с указанным значением этого поля получают номера >1. И не попадают в резалтсет. Но стоит лишь рассматривать записи только с данным именем, как какая-нибудь запись да получит номер 1 обязательно. |
17 сен 12, 15:27 [13176644] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47052 |
А по теме: это и не бага и не фича. |
17 сен 12, 15:29 [13176662] Ответить | Цитировать Сообщить модератору |
rector Member Откуда: Киев Сообщений: 57 |
iap, да, провтыкал. Исходил из того, что Login в таблице с юзерами уникальный для каждого пользователя. Оказалось, что нет :) Спасибо за наводку |
17 сен 12, 15:34 [13176710] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |