Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 IS NULL or JOIN  [new]
relief
Member

Откуда:
Сообщений: 1197
Привет

Есть таблица продаж.
К ней делается запрос в котором могут передаваться города или модели для фильтрации. Если данные для фильтрации не передаются (NULL) то надо возвращать все продажи.

Вот такой код у меня получился. Но он не работает. Как достичь результата?

declare @sales table(id int, model varchar(10), city  varchar(10))

insert @sales select 1, 'gt-2', 'Kiev'
insert @sales select 2, 'gt-2', 'Livov'
insert @sales select 3, 'gt-4', 'Kerch'

declare @modelToFind varchar(max)
declare @modelToFindTbl table(model varchar(10))

declare @cityToFind varchar(max)
declare @cityToFindTbl table(city varchar(10))

select * from @sales s, @modelToFindTbl m, @cityToFindTbl c 
   where (@modelToFind is null or (s.model = m.model))
         and 
		 (@cityToFind is null or (s.city = c.city))
12 авг 13, 15:52    [14697599]     Ответить | Цитировать Сообщить модератору
 Re: IS NULL or JOIN  [new]
Glory
Member

Откуда:
Сообщений: 104751
relief
Вот такой код у меня получился. Но он не работает.

Потому что cross join c пустой таблицей есть пустая таблица
12 авг 13, 15:56    [14697629]     Ответить | Цитировать Сообщить модератору
 Re: IS NULL or JOIN  [new]
relief
Member

Откуда:
Сообщений: 1197
Glory
relief
Вот такой код у меня получился. Но он не работает.

Потому что cross join c пустой таблицей есть пустая таблица


inner join тоже не работает.
12 авг 13, 15:58    [14697643]     Ответить | Цитировать Сообщить модератору
 Re: IS NULL or JOIN  [new]
Glory
Member

Откуда:
Сообщений: 104751
relief
inner join тоже не работает.

Вы математику учили в школе ?
Сколько будет 1 умножить на 0 ?
А 2 умножить на 0 ?
А 10 умножить на 0 ?
12 авг 13, 16:00    [14697652]     Ответить | Цитировать Сообщить модератору
 Re: IS NULL or JOIN  [new]
relief
Member

Откуда:
Сообщений: 1197
Glory
relief
inner join тоже не работает.

Вы математику учили в школе ?
Сколько будет 1 умножить на 0 ?
А 2 умножить на 0 ?
А 10 умножить на 0 ?


я пишу вот так
(@modelToFind is null [b]or[/b] (s.model = m.model))


@modelToFind is null второе условие проверять не надо
12 авг 13, 16:02    [14697669]     Ответить | Цитировать Сообщить модератору
 Re: IS NULL or JOIN  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
relief
Glory
пропущено...

Потому что cross join c пустой таблицей есть пустая таблица


inner join тоже не работает.

попробуйте полусоединения in или exist
12 авг 13, 16:02    [14697670]     Ответить | Цитировать Сообщить модератору
 Re: IS NULL or JOIN  [new]
Glory
Member

Откуда:
Сообщений: 104751
relief
@modelToFind is null второе условие проверять не надо

Офигеть
И как по условию @modelToFind is null сервер должен построить соединение ?
12 авг 13, 16:03    [14697676]     Ответить | Цитировать Сообщить модератору
 Re: IS NULL or JOIN  [new]
relief
Member

Откуда:
Сообщений: 1197
Мистер Хенки
relief
пропущено...


inner join тоже не работает.

попробуйте полусоединения in или exist


exists по производительности сильно проседает
12 авг 13, 16:04    [14697677]     Ответить | Цитировать Сообщить модератору
 Re: IS NULL or JOIN  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
LEFT|RIGHT OUTER JOIN
может вам подойдет?
12 авг 13, 16:05    [14697686]     Ответить | Цитировать Сообщить модератору
 Re: IS NULL or JOIN  [new]
relief
Member

Откуда:
Сообщений: 1197
Glory
relief
@modelToFind is null второе условие проверять не надо

Офигеть
И как по условию @modelToFind is null сервер должен построить соединение ?


его не надо строить. надо строить если не налл. по-моему гибко
12 авг 13, 16:05    [14697691]     Ответить | Цитировать Сообщить модератору
 Re: IS NULL or JOIN  [new]
kjgjgjgj
Guest
relief,

я бы запилил четыре запроса с вариантами параметров

null null
not null/null
null/not null
not null/not null

в логике приложения проверял бы какой из запросов запилить в базу.
12 авг 13, 16:06    [14697694]     Ответить | Цитировать Сообщить модератору
 Re: IS NULL or JOIN  [new]
Glory
Member

Откуда:
Сообщений: 104751
relief
его не надо строить. надо строить если не налл. по-моему гибко

Фейспалм просто какой то
А как же серверу выбирать из двух таблиц, не используя хоть какое то соединение ?
12 авг 13, 16:07    [14697701]     Ответить | Цитировать Сообщить модератору
 Re: IS NULL or JOIN  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
relief
Мистер Хенки
пропущено...

попробуйте полусоединения in или exist


exists по производительности сильно проседает

так у вас не с чем сравнивать.
select * from @sales s, @modelToFindTbl m, @cityToFindTbl c 
   where (@modelToFind is null or (s.model = m.model))
         and 
		 (@cityToFind is null or (s.city = c.city))

не работает же как надо )))
12 авг 13, 16:07    [14697705]     Ответить | Цитировать Сообщить модератору
 Re: IS NULL or JOIN  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
во FROM у вас списко таблиц через запятую, значит соединение вы используете по where - это устаревший способ

попробуйте через явный JOIN построить свой запрос, начните с первых 2-х таблиц и идите дальше по условию отбора
12 авг 13, 16:08    [14697707]     Ответить | Цитировать Сообщить модератору
 Re: IS NULL or JOIN  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
relief
Glory
пропущено...

Офигеть
И как по условию @modelToFind is null сервер должен построить соединение ?


его не надо строить. надо строить если не налл. по-моему гибко
Для чего Вы приплели две пустые табличные переменные?
Вот это объясните, пожалуйста.
12 авг 13, 16:09    [14697719]     Ответить | Цитировать Сообщить модератору
 Re: IS NULL or JOIN  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Konst_One
во FROM у вас списко таблиц через запятую, значит соединение вы используете по where - это устаревший способ

попробуйте через явный JOIN построить свой запрос, начните с первых 2-х таблиц и идите дальше по условию отбора
Две таблицы из трёх пустые!
Glory уже полчаса намекает!
12 авг 13, 16:10    [14697725]     Ответить | Цитировать Сообщить модератору
 Re: IS NULL or JOIN  [new]
relief
Member

Откуда:
Сообщений: 1197
Konst_One
LEFT|RIGHT OUTER JOIN
может вам подойдет?


оу. Круто
Сделал так

declare @sales table(id int, model varchar(10), city  varchar(10))

insert @sales select 1, 'gt-2', 'Kiev'
insert @sales select 2, 'gt-2', 'Livov'
insert @sales select 3, 'gt-4', 'Kerch'

declare @modelToFind varchar(max)
set @modelToFind = ''

declare @modelToFindTbl table(model varchar(10))
insert @modelToFindTbl select 'gt-2'

declare @cityToFind varchar(max)
declare @cityToFindTbl table(city varchar(10))

select * from @sales s
   left join @modelToFindTbl m
     on s.model = m.model
where @modelToFind is null or s.model = m.model
12 авг 13, 16:12    [14697740]     Ответить | Цитировать Сообщить модератору
 Re: IS NULL or JOIN  [new]
relief
Member

Откуда:
Сообщений: 1197
iap
Konst_One
во FROM у вас списко таблиц через запятую, значит соединение вы используете по where - это устаревший способ

попробуйте через явный JOIN построить свой запрос, начните с первых 2-х таблиц и идите дальше по условию отбора
Две таблицы из трёх пустые!
Glory уже полчаса намекает!


я их не заполнил, т.к. переменные-параметры запроса NULL => надо всё выбирать
12 авг 13, 16:13    [14697754]     Ответить | Цитировать Сообщить модератору
 Re: IS NULL or JOIN  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
relief
iap
пропущено...
Две таблицы из трёх пустые!
Glory уже полчаса намекает!


я их не заполнил, т.к. переменные-параметры запроса NULL => надо всё выбирать
Ну вот кто-нибудь чего-нибудь понял?!
12 авг 13, 16:15    [14697767]     Ответить | Цитировать Сообщить модератору
 Re: IS NULL or JOIN  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
iap
relief
пропущено...


я их не заполнил, т.к. переменные-параметры запроса NULL => надо всё выбирать
Ну вот кто-нибудь чего-нибудь понял?!




ТС жжёт
12 авг 13, 16:15    [14697770]     Ответить | Цитировать Сообщить модератору
 Re: IS NULL or JOIN  [new]
relief
Member

Откуда:
Сообщений: 1197
Konst_One
iap
пропущено...
Ну вот кто-нибудь чего-нибудь понял?!




ТС жжёт


не понимаю, что непонятно.
есть процедура в которой 2 входных параметра.
если любой из параметров != null то я заполняю табличные переменные нужными значениями, которые передаются в параметре через запятую и потом эту табличную переменную джойню на основную таблицу.
12 авг 13, 16:19    [14697804]     Ответить | Цитировать Сообщить модератору
 Re: IS NULL or JOIN  [new]
rtgtrere
Guest
relief,
если в один запрос

declare @sales table(id int, model varchar(10), city  varchar(10))
declare @city_to_find varchar(10)
declare @model_to_find varchar(10)

insert @sales select 1, 'gt-2', 'Kiev'
insert @sales select 2, 'gt-2', 'Livov'
insert @sales select 3, 'gt-4', 'Kerch'

set @model_to_find = 'gt-4'

select *
from @sales
where
	(
		city like @city_to_find + '%' and
		model like @city_to_find + '%'
	)
	or
	(
		city like @city_to_find + '%' and
		isnull(@model_to_find, '-1') = '-1'
	)
	or
	(
		isnull(@city_to_find, '-1') = '-1' and
		model like @model_to_find + '%'
	)
	or
	(
		isnull(@city_to_find, '-1') = '-1' and
		isnull(@model_to_find, '-1') = '-1'
	)
12 авг 13, 16:21    [14697813]     Ответить | Цитировать Сообщить модератору
 Re: IS NULL or JOIN  [new]
Glory
Member

Откуда:
Сообщений: 104751
relief
iap
пропущено...
Две таблицы из трёх пустые!
Glory уже полчаса намекает!


я их не заполнил, т.к. переменные-параметры запроса NULL => надо всё выбирать

Сервер теперь еще и тип соединения оказывается должен подбирать в зависимости от значения переменной ?
12 авг 13, 16:21    [14697816]     Ответить | Цитировать Сообщить модератору
 Re: IS NULL or JOIN  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Нафига лишние таблицы???
relief
declare @sales table(id int, model varchar(10), city  varchar(10))

insert @sales select 1, 'gt-2', 'Kiev'
insert @sales select 2, 'gt-2', 'Livov'
insert @sales select 3, 'gt-4', 'Kerch'

declare @modelToFind varchar(max)
declare @modelToFindTbl table(model varchar(10))

declare @cityToFind varchar(max)
declare @cityToFindTbl table(city varchar(10))

select * from @sales s, @modelToFindTbl m, @cityToFindTbl c
   where (@modelToFind is null or (s.model = m.model))
         and 
		 (@cityToFind is null or (s.city = c.city))
Выделенное удалить - все заработает
12 авг 13, 16:22    [14697828]     Ответить | Цитировать Сообщить модератору
 Re: IS NULL or JOIN  [new]
wedwedewd
Guest
lol fix

select *
from @sales
where
	(
		city like @city_to_find + '%' and
		model like @city_to_find + '%'
	)
	or
	(
		city like @city_to_find + '%' and
		@model_to_find is null
	)
	or
	(
		@city_to_find is null and
		model like @model_to_find + '%'
	)
	or
	(
		@city_to_find is null and
		@model_to_find is null
	)
12 авг 13, 16:24    [14697843]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить