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

Откуда: Новосибирск
Сообщений: 290
Всем привет!

есть ли в MSSQL такой синтаксис - несколько полей в "in" clause типа вот этого?:

select * from tbl1 where (f1, f2, f3, f4,...)
in (select f1, f2, f3, f4,... from ...)

помню что в Оракле есть

порылся в BOL - не нашел
22 мар 05, 11:29    [1404703]     Ответить | Цитировать Сообщить модератору
 Re: несколько полей в "in" clause  [new]
iSestrin
Member

Откуда: Новосибирск
Сообщений: 3811
просто join по этим полям
22 мар 05, 11:31    [1404714]     Ответить | Цитировать Сообщить модератору
 Re: несколько полей в "in" clause  [new]
Ionah
Member

Откуда: Новосибирск
Сообщений: 290
а если эти поля содержат nulls?
22 мар 05, 11:32    [1404716]     Ответить | Цитировать Сообщить модератору
 Re: несколько полей в "in" clause  [new]
Лео
Member

Откуда: Москва
Сообщений: 207
select * from tbl1 where cast(isNull(f1,'') as varchar())+'Original Delimiter'+cast(isNull(f2,'') as varchar()),...
in (select cast(isNull(f1,'') as varchar())+'Original Delimiter'+cast(isNull(f2,'') as varchar),... from ...)
22 мар 05, 11:43    [1404764]     Ответить | Цитировать Сообщить модератору
 Re: несколько полей в "in" clause  [new]
Лео
Member

Откуда: Москва
Сообщений: 207
Тормоза обеспеченны.
22 мар 05, 11:43    [1404768]     Ответить | Цитировать Сообщить модератору
 Re: несколько полей в "in" clause  [new]
Ionah
Member

Откуда: Новосибирск
Сообщений: 290
вот мой вариант:

(select PK,
isnull(f1, -10000) as f1
isnull(f2, -10000) as f2
...
from
...
) t1 inner join
(select
isnull(f1, -10000) as f1
isnull(f2, -10000) as f2
...
from
...) t2 on t1.f1 = t1.f1
and t1.f2 = t1.f2
...

но мне для этого нужно:

1) знать значение которого нет и не будет в каждой колонке из запроса
2) делать неоптимальный запрос

блииин
в который раз убеждаюсь, MSSQL - жуткое г.
22 мар 05, 11:47    [1404787]     Ответить | Цитировать Сообщить модератору
 Re: несколько полей в "in" clause  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
Ionah
блииин
в который раз убеждаюсь, MSSQL - жуткое г.

спешу вас расстроить - это ваш запрос жуткое г.
22 мар 05, 11:51    [1404805]     Ответить | Цитировать Сообщить модератору
 Re: несколько полей в "in" clause  [new]
Ionah
Member

Откуда: Новосибирск
Сообщений: 290
вот именно

это MSSQL заставляет меня делать все жерез №%?:


пожалуйста, предложите свой запрос - не в пример оптимальнее
22 мар 05, 12:03    [1404862]     Ответить | Цитировать Сообщить модератору
 Re: несколько полей в "in" clause  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
1)про г - я говорил про изначальный запрос
2)
select * from tbl1 where (f1, f2, f3, f4,...)
in (select f1, f2, f3, f4,... from ...)
не равен вовсе вашему варианту здесь
3)
этот вариант вряд ли будет сильно отличаться по производительности от запроса
select * from tbl1 where (f1, f2, f3, f4,...)
in (select f1, f2, f3, f4,... from ...)
в оракле
22 мар 05, 12:15    [1404902]     Ответить | Цитировать Сообщить модератору
 Re: несколько полей в "in" clause  [new]
Taffy
Member

Откуда:
Сообщений: 20501
select t.*
from ( select ff = f1, id
         from tbl1 
         union all
         select ff = f2, id
         from tbl1 
         union all
         select ff = f3,id 
         from tbl1 
         union all
         select ff = f4, id
         from tbl1 ) a inner join
	( select ff = f1
         from tbl1 
         union
         select ff = f2
         from tbl1 
         union
         select ff = f3
         from  
         union all
         select ff = f4
         from  ) b on a.ff = b.ff inner join
	tbl1 t on t.id = a.id 
А мне не нравится Оракл. Ну и что? Надо будет - освою. И буду понимать, что есть ограничения, которые на меня накладывает тот или иной инструмент.
22 мар 05, 12:15    [1404904]     Ответить | Цитировать Сообщить модератору
 Re: несколько полей в "in" clause  [new]
Ionah
Member

Откуда: Новосибирск
Сообщений: 290
Smirnov Anton

1)про г - я говорил про изначальный запрос
2)
select * from tbl1 where (f1, f2, f3, f4,...)
in (select f1, f2, f3, f4,... from ...)
не равен вовсе вашему варианту здесь


по порядку:
изначальный запрос очень нужный и полезный
реальная задача - определить первичный ключ у записей - дублей по некоторому набору полей.

окончательный запрос будет таким:
select
t1.pk
from
(select
pk,
isnull(f1, -10000) as f1,
isnull(f2, -10000) as f2
from tbl1) t1 inner join
(select
isnull(f1, -10000) as f1,
isnull(f2, -10000) as f2
from tbl1
group by
isnull(f1, -10000),
isnull(f2, -10000)
) t2
on t1.f1 = t1.f1
and t1.f2 = t1.f2



Smirnov Anton

3)этот вариант вряд ли будет сильно отличаться по производительности от запроса
select * from tbl1 where (f1, f2, f3, f4,...)
in (select f1, f2, f3, f4,... from ...)
в оракле


а... а вот это смелое предположение
выполняли такие запросы на Оракле и смотрели план исполнения?
22 мар 05, 12:27    [1404957]     Ответить | Цитировать Сообщить модератору
 Re: несколько полей в "in" clause  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
1)в вашем первой переделке group by не было, по этому он(первый) был не правильный
2)про "смелое предположение" - нет, планы не смотрел, это и есть предположение(см "вряд ли")
3)
автор
реальная задача - определить первичный ключ у записей - дублей по некоторому набору полей.

и чем вас ваше решение не устраивает
select t1.pk from
(select pk, isnull(f1, -10000) as f1,isnull(f2, -10000) as f2
from tbl1) t1 inner join
(select isnull(f1, -10000) as f1,isnull(f2, -10000) as f2
from tbl1 group by isnull(f1, -10000),isnull(f2, -10000)
having count(*)>1
) t2 on t1.f1 = t1.f1 and t1.f2 = t1.f2
или вы думете, что это будет медленнее, чем через in
22 мар 05, 12:41    [1405009]     Ответить | Цитировать Сообщить модератору
 Re: несколько полей в "in" clause  [new]
Ionah
Member

Откуда: Новосибирск
Сообщений: 290
Smirnov Anton

и чем вас ваше решение не устраивает


ну я же написал :) :


но мне для этого нужно:

1) знать значение которого нет и не будет в каждой колонке из запроса
2) делать неоптимальный запрос


"неоптимальный запрос" имеется ввиду:
при большой таблице будет тормозить
патамушта MSSQL не будет использовать индексы


вобщем понятно,
я думал что просто не знаю как написать известный синтаксис
а оказалось в MSSQL его вообще нет :(
22 мар 05, 13:06    [1405131]     Ответить | Цитировать Сообщить модератору
 Re: несколько полей в "in" clause  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
Ionah
реальная задача - определить первичный ключ у записей - дублей по некоторому набору полей

Вам, случаем, не это ли нужно?
select distinct
  t1.pk
from tbl1 t1
  inner join tbl1 t2 on
    ((t1.f1 = t2.f1) or (t1.f1 is null and t2.f1 is null))
    and ((t1.f2 = t2.f2) or (t1.f2 is null and t2.f2 is null))
    and t2.pk <> t1.pk
22 мар 05, 13:09    [1405153]     Ответить | Цитировать Сообщить модератору
 Re: несколько полей в "in" clause  [new]
Ionah
Member

Откуда: Новосибирск
Сообщений: 290
daw
Ionah
реальная задача - определить первичный ключ у записей - дублей по некоторому набору полей

Вам, случаем, не это ли нужно?
select distinct
  t1.pk
from tbl1 t1
  inner join tbl1 t2 on
    ((t1.f1 = t2.f1) or (t1.f1 is null and t2.f1 is null))
    and ((t1.f2 = t2.f2) or (t1.f2 is null and t2.f2 is null))
    and t2.pk <> t1.pk


да, очень может быть
сейчас потестирую

спасибо
22 мар 05, 13:20    [1405207]     Ответить | Цитировать Сообщить модератору
 Re: несколько полей в "in" clause  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
автор
но мне для этого нужно:
1) знать значение которого нет и не будет в каждой колонке из запроса
2) делать неоптимальный запрос

1) можно и без этого знячения
см daw или вот
declare @t table(id int, f1 int, f2 int)
insert into @t
select 1,null,1 union all
select 2,null,null union all
select 3,1,1 union all
select 4,2,null union all
select 5,null,1 union all
select 6,3,1 union all
select 7,2,null union all
select 8,3,1

select *
from @t t1  join
(select f1,f2 from @t group by f1,f2 having count(*)>1) t2
on isnull(t1.f1,-1)=isnull(t2.f1,-1) and isnull(t1.f2,-1)=isnull(t2.f2,-1)

select *
from @t t1 left join
(select f1,f2 from @t group by f1,f2 having count(*)>1) t2
on t1.f1=t2.f1 and t1.f2=t2.f2
where (nullif(t1.f1,t2.f1) is  null or nullif(t1.f2,t2.f2) is  null) 
       and COALESCE(t1.f1,t2.f1,t1.f2,t2.f2) is not null
2)а то, что не оптимальный - дык вариант с in так же прведёт к сканам
22 мар 05, 13:21    [1405218]     Ответить | Цитировать Сообщить модератору
 Re: несколько полей в "in" clause  [new]
Dimais
Member

Откуда:
Сообщений: 227
а exists разве не катит ..... ?
22 мар 05, 13:54    [1405384]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить