Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Можно ли представить NOT IN (NOT IN ...) через JOIN/NOT EXISTS?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
SomewhereSomehow,

group by all <-- all можно убрать, остался от эксперимента
30 ноя 12, 13:31    [13555584]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли представить NOT IN (NOT IN ...) через JOIN/NOT EXISTS?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
SomewhereSomehow,

не знаю, как сработает "max()" и "<=" если часть полей будут текстовыми...
надо попробовать
30 ноя 12, 13:39    [13555665]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли представить NOT IN (NOT IN ...) через JOIN/NOT EXISTS?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
TJ001,
как быть в таком случае?
DECLARE @Table2 table (ID2 int, Val2 int, val3 int, val4 char(3))
INSERT @Table2 values(1,1,0,' 0 ')
INSERT @Table2 values(1,1,0,' 0 ')
INSERT @Table2 values(2,5,1,' 0 ')
INSERT @Table2 values(2,5,0,' 0 ')
INSERT @Table2 values(3,8,1,' 0 ')
INSERT @Table2 values(5,5,6,' 4 ')
INSERT @Table2 values(5,5,5,' 0 ')
INSERT @Table2 values(6,5,3,' 0 ')

declare @val3 int, @val4 char(3);
set @val3 = 5;
set @val4 = ' 4 ';
30 ноя 12, 13:46    [13555724]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли представить NOT IN (NOT IN ...) через JOIN/NOT EXISTS?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
TJ001
SomewhereSomehow,

не знаю, как сработает "max()" и "<=" если часть полей будут текстовыми...
надо попробовать

Ну вот, появились текстовые поля, еще кусочек задачи всплыл.
Текст и числа сравниваются по-разному
if 10 > 2 select 'true' else select 'false'
if '10' > '2' select 'true' else select 'false'

Давайте еще добавим условие "на-ходу", а что если там будет лежать строка в xml, которую нужно совсем по особенному сравнивать? Или text? Видимо моя просьба обратить внимание на рекомендацию описать задачу целиком, была проигнорирована...
30 ноя 12, 14:21    [13555996]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли представить NOT IN (NOT IN ...) через JOIN/NOT EXISTS?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
SomewhereSomehow,

ну не пинайте меня так сразу)))

там могут быть только текстовые и числовые поля
NULL в них не бывает, обязательно что-то есть
если поле текстовое то "пустое" значение - ' 0 '
либо число - 0, других не бывает
30 ноя 12, 15:09    [13556457]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли представить NOT IN (NOT IN ...) через JOIN/NOT EXISTS?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
TJ001
SomewhereSomehow,

ну не пинайте меня так сразу)))

там могут быть только текстовые и числовые поля
NULL в них не бывает, обязательно что-то есть
если поле текстовое то "пустое" значение - ' 0 '
либо число - 0, других не бывает


@EmptyID varchar(9)
SET @EmptyID = '     0   '
30 ноя 12, 15:10    [13556463]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли представить NOT IN (NOT IN ...) через JOIN/NOT EXISTS?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
TJ001,

как склеить все воедино?
30 ноя 12, 15:11    [13556468]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли представить NOT IN (NOT IN ...) через JOIN/NOT EXISTS?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
В текстовых полях могут быть цифры и латинские буквы
30 ноя 12, 15:35    [13556698]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли представить NOT IN (NOT IN ...) через JOIN/NOT EXISTS?  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3104
TJ001,
и что Вы хотите получить при добавлении условия по второму полю?
1 дек 12, 18:46    [13562060]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли представить NOT IN (NOT IN ...) через JOIN/NOT EXISTS?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
Результат должен быть тот же
ид2=1 (потому что все значения val3 = 0, т.е. "пусто", значит у объекта фильтр не задан, для val4 та же ситуация)
ид2=5 (потому что @val3=5 и это является одним из значений в поле val3, @val4 так же является одним из значений поля val4 внутри этого же ид2)

понимаю, что это сложновато для восприятия, но как еще объяснить я не знаю...

т.е. если какие-то моменты я пропустил сразу, это не от лени и не от того, что я игнорирую правила и не ценю ваше время, просто не придал значения, т.к. для моего варианта запроса неважно сколько полей и какого они типа...

спасибо, что занимаетесь моим вопросом! очень надеюсь на удачный исход
3 дек 12, 10:00    [13566736]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли представить NOT IN (NOT IN ...) через JOIN/NOT EXISTS?  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3104
как вариант
DECLARE @Table1 table (ID int, Val int)
INSERT @Table1 values(1,5)
INSERT @Table1 values(2,8)
INSERT @Table1 values(3,10)
INSERT @Table1 values(4,7)
INSERT @Table1 values(5,0)
INSERT @Table1 values(6,4)
INSERT @Table1 values(7,4)

DECLARE @Table2 table (ID2 int, Val2 int, val3 int, val4 char(3))
INSERT @Table2 values(1,1,0,' 0 ')
INSERT @Table2 values(1,1,0,' 0 ')
INSERT @Table2 values(2,5,1,' 0 ')
INSERT @Table2 values(2,5,0,' 0 ')
INSERT @Table2 values(3,8,1,' 0 ')
INSERT @Table2 values(5,5,6,' 4 ')
INSERT @Table2 values(5,5,5,' 0 ')
INSERT @Table2 values(6,5,3,' 0 ')

declare @val3 int, @val4 char(3);
set @val3 = 5;
set @val4 = ' 4 ';

declare @param1 int = 5
declare @param2 char(3) = ' 4 '
select * from @Table1 t1
left join (
select
	t.ID2
from
	@Table2 t
group by
	t.ID2
having
	sum(case when val3 = 0 then 0 else 1 end) * min(case when val3 = @param1 then 0 else 1 end) > 0
	or sum(case when val4 = ' 0 ' then 0 else 1 end) * min(case when val4 = @param2 then 0 else 1 end) > 0
) t2 on t2.ID2 = t1.ID
where
	t2.ID2 is null

по этому же принципу, можно нарацивать любое кол-во проверок
3 дек 12, 10:10    [13566790]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли представить NOT IN (NOT IN ...) через JOIN/NOT EXISTS?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
спасибо!
буду разбираться)))
3 дек 12, 10:13    [13566807]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли представить NOT IN (NOT IN ...) через JOIN/NOT EXISTS?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
HandKot,

чет не въеду, для чего нужны @param1,2?
3 дек 12, 10:18    [13566824]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли представить NOT IN (NOT IN ...) через JOIN/NOT EXISTS?  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3104
это клоны Ваших @val3 и @val4

если не нравится - замените на Ваши обозначения
3 дек 12, 10:21    [13566832]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли представить NOT IN (NOT IN ...) через JOIN/NOT EXISTS?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
HandKot,

т.е.
case when val3 = @param1 then 0 else 1 end

можно заменить на
nullif(val3,@val3)


????
3 дек 12, 10:24    [13566846]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли представить NOT IN (NOT IN ...) через JOIN/NOT EXISTS?  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3104
TJ001
HandKot,

т.е.
case when val3 = @param1 then 0 else 1 end

можно заменить на
nullif(val3,@val3)


????


нет нельзя
у меня возвращается 0,
nullif вернет null
3 дек 12, 10:25    [13566855]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли представить NOT IN (NOT IN ...) через JOIN/NOT EXISTS?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
это эквивалентно?
case when val3 = @val3 then 0 else 1 end


отрицательных значений нет, но на всякий случай спрашиваю, как поведет себя запрос если будут, нужно будет что-то переделывать?
3 дек 12, 10:32    [13566894]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли представить NOT IN (NOT IN ...) через JOIN/NOT EXISTS?  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3104
TJ001
это эквивалентно?
case when val3 = @val3 then 0 else 1 end


отрицательных значений нет, но на всякий случай спрашиваю, как поведет себя запрос если будут, нужно будет что-то переделывать?

да,
и пофигу какие значения, отрицательные или нет
и даже пофиг на нул и не нул

думаю, переделывать не надо будет
3 дек 12, 10:35    [13566909]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли представить NOT IN (NOT IN ...) через JOIN/NOT EXISTS?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
благодарю!)
3 дек 12, 10:38    [13566922]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли представить NOT IN (NOT IN ...) через JOIN/NOT EXISTS?  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3104
TJ001
благодарю!)

рано
и, как всегда, когда все кажется, что всё в шоколаде, читаем текст, написанный маленькими буковками "вся ответственность за.... лежит на Вас"
3 дек 12, 10:41    [13566947]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли представить NOT IN (NOT IN ...) через JOIN/NOT EXISTS?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
спасибо как минимум за то, что уделяете мне время!)

и еще, в своем запросе час назад заметил баг, он выводит правильный результат только когда сочетания "явно указанных" значения находятся в одной строке, если их разнести по разным, то условие уже не выполняется, а должно

для 
set @val3 = 5;
set @val4 = ' 4 ';

--такой вариант записей мой запрос пропускает, т.е. не выбирает
INSERT @Table2 values(5,5,6,' 4 ')
INSERT @Table2 values(5,5,5,' 0 ')

--а в этом отрабатывает корректно
INSERT @Table2 values(5,5,5,' 4 ')
INSERT @Table2 values(5,5,6,' 0 ')


однако, в Вашем варианте все правильно срабатывает!)))
3 дек 12, 11:17    [13567186]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли представить NOT IN (NOT IN ...) через JOIN/NOT EXISTS?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
HandKot,

на случай, если не передали параметр, т.е. он равен "пустому" значению, условие должно выполняться для всех

тогда, если я правильно понял, будет так

sum(case when val3 = 0 then 0 else 1 end) * min(case when val3 = @val3 then 0 else 1 end) * min(case when @val3 = 0 then 0 else 1 end) > 0


?
3 дек 12, 11:44    [13567378]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли представить NOT IN (NOT IN ...) через JOIN/NOT EXISTS?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
или так
sum(case when val3 = 0 or @val3 = 0 then 0 else 1 end) * min(case when val3 = @val3 then 0 else 1 end) > 0
3 дек 12, 11:48    [13567421]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли представить NOT IN (NOT IN ...) через JOIN/NOT EXISTS?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
это для того чтобы не приходилось менять текст запроса в зависимости от того передали параметр или нет
3 дек 12, 11:54    [13567466]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли представить NOT IN (NOT IN ...) через JOIN/NOT EXISTS?  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3104
TJ001
HandKot,

на случай, если не передали параметр, т.е. он равен "пустому" значению, условие должно выполняться для всех

тогда, если я правильно понял, будет так

sum(case when val3 = 0 then 0 else 1 end) * min(case when val3 = @val3 then 0 else 1 end) * min(case when @val3 = 0 then 0 else 1 end) > 0


?

да, так пойдет
3 дек 12, 11:58    [13567505]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить