Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите новичку с исчезающими Null после not in ()  [new]
xKIA
Member

Откуда:
Сообщений: 53
Пытаюсь изучать SQL в MS Express SQL Server 2008 на базе из онлайновой игры EVE.
Делаю такой простой запрос:
/****** Сценарий для команды SelectTopNRows среды SSMS  ******/
SELECT  typ.[typeID]
       ,[typeName]
       ,typ.[groupID]
       ,[volume]
       ,[portionSize]
       ,[marketGroupID]
       ,categor.categoryID
       ,categoryName
       ,allowManufacture
       ,ISNULL( metaGroupName, 'Unknown' ) as metaGroupName


  FROM [EVE].[dbo].[invTypes] typ 
  left outer join [EVE].[dbo].[invGroups] grp on typ.groupID=grp.groupID 
  left outer join [EVE].[dbo].[invCategories] categor on grp.categoryID=categor.categoryID 
  left outer join [EVE].[dbo].[invMetaTypes] meta on typ.typeID=meta.typeID
  left outer join [EVE].[dbo].[invMetaGroups] metag on meta.metaGroupID=metag.metaGroupID
  where marketGroupID is not null
 and categoryName not in ('Blueprint','Skill', 'Implant', 'Reaction') 
 --and metaGroupName not in ('Storyline','Tech II', 'Tech III') 
order by typeName
 
Это работает нормально, но если разкомментировать предпоследнюю строчку, то из результат пропадут строки с categoryName равным, к примеру 'Ship', у этой строки metaGroupName равна Null или, после моей замены 'Unknown;, но это не повлияло на ситуацию..
Объясните мои заблуждения, пожалуйста.
19 ноя 09, 13:53    [7950696]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку с исчезающими Null после not in ()  [new]
Konst_One
Member

Откуда:
Сообщений: 11513
where marketGroupID is not null
 and categoryName not in ('Blueprint','Skill', 'Implant', 'Reaction') 
 --and metaGroupName not in ('Storyline','Tech II', 'Tech III') 
order by typeName


и в каких же таблицах эти поля? укажите чётко алиасы:
marketGroupID
metaGroupName
categoryName
typeName
19 ноя 09, 13:56    [7950717]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку с исчезающими Null после not in ()  [new]
Le Peace
Member

Откуда: Москва
Сообщений: 8969
null not in 'что-то' эквивалентно unknown, а не true.
19 ноя 09, 13:57    [7950729]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку с исчезающими Null после not in ()  [new]
Glory
Member

Откуда:
Сообщений: 104760
xKIA
у этой строки metaGroupName равна Null или, после моей замены 'Unknown;, но это не повлияло на ситуацию..

Разумеется не повлияло. Потому что в "and metaGroupName not in ('Storyline','Tech II', 'Tech III') " используется поле таблицы, а не вычисляемый столбец ISNULL( metaGroupName, 'Unknown' ) as metaGroupName
19 ноя 09, 13:58    [7950732]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку с исчезающими Null после not in ()  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
xKIA
Пытаюсь изучать SQL в MS Express SQL Server 2008 на базе из онлайновой игры EVE.

синьор эстет?

xKIA
and metaGroupName not in ('Storyline','Tech II', 'Tech III')

and ISNULL( metaGroupName, 'Unknown' ) not in ('Storyline','Tech II', 'Tech III')
19 ноя 09, 13:59    [7950739]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку с исчезающими Null после not in ()  [new]
xKIA
Member

Откуда:
Сообщений: 53
Konst_One

и в каких же таблицах эти поля? укажите чётко алиасы:
marketGroupID
metaGroupName
categoryName
typeName

marketGroupID dbo.invMetaGroups
metaGroupName dbo.invMetaGroups
categoryName dbo.invCategories
typeName dbo.invMetaTypes и dbo.inv.Types
19 ноя 09, 14:06    [7950795]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку с исчезающими Null после not in ()  [new]
xKIA
Member

Откуда:
Сообщений: 53
Дедушка

xKIA
and metaGroupName not in ('Storyline','Tech II', 'Tech III')

and ISNULL( metaGroupName, 'Unknown' ) not in ('Storyline','Tech II', 'Tech III')

Спасибо, Дедушка, я всё понял и всё заработал!
19 ноя 09, 14:09    [7950825]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку с исчезающими Null после not in ()  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
xKIA
Konst_One

и в каких же таблицах эти поля? укажите чётко алиасы:
marketGroupID
metaGroupName
categoryName
typeName

marketGroupID dbo.invMetaGroups
metaGroupName dbo.invMetaGroups
categoryName dbo.invCategories
typeName dbo.invMetaTypes и dbo.inv.Types
Когда Вы накладываете условия в WHERE на поля таблиц, заданных в правой части LEFT JOIN,
Вы превращаете эти LEFT JOINы в INNER JOINы! Это детская ошибка. Не делайте так.

NOT IN почти всегда лучше заменять на NOT EXISTS. Чтобы было меньше неожиданностей из-за NULLов.
19 ноя 09, 14:13    [7950862]     Ответить | Цитировать Сообщить модератору
 Re: Помогите новичку с исчезающими Null после not in ()  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
iap
NOT IN почти всегда лучше заменять на NOT EXISTS. Чтобы было меньше неожиданностей из-за NULLов.
Ой! Пршу прощения. Это я про NOT IN (подзапрос) написал (не Ваш случай).
19 ноя 09, 14:15    [7950877]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить