Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Баг или фича?  [new]
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:
CODENAMEEMAILLOGINPASSWORDLANGUAGEIMPERSONATIONTESTERISACTIVEDECIMALSEPARATOR


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]     Ответить | Цитировать Сообщить модератору
 Re: Баг или фича?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
rector
но.... если преобразовать запрос следующим образом:
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
Всё очень просто - вы не понимаете смысл запроса.
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]     Ответить | Цитировать Сообщить модератору
 Re: Баг или фича?  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
rector,

элементарно!
Из подзапроса во внешнем запросе остаются не все записи, а толлько под первым номером в группе по [LOGIN]
Если не ограничивать по name, все записи с указанным значением этого поля получают номера >1.
И не попадают в резалтсет.
Но стоит лишь рассматривать записи только с данным именем, как какая-нибудь запись да получит номер 1 обязательно.
17 сен 12, 15:27    [13176644]     Ответить | Цитировать Сообщить модератору
 Re: Баг или фича?  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
А по теме: это и не бага и не фича.
17 сен 12, 15:29    [13176662]     Ответить | Цитировать Сообщить модератору
 Re: Баг или фича?  [new]
rector
Member

Откуда: Киев
Сообщений: 57
iap,

да, провтыкал.
Исходил из того, что Login в таблице с юзерами уникальный для каждого пользователя.
Оказалось, что нет :)

Спасибо за наводку
17 сен 12, 15:34    [13176710]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить