![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Выборка [D6, MSSQL]
wild_arg © (2004-08-10 09:26:00)Eсть таблица :
_____
a | x
b | y
a | y
c | z
b | x
b | z
a | z
Надо выбрать только те элементы из первого столбца, которые встречаются в таблице и с "x", и с "у", и с "z"
т.е. результатом будет:
a
b
как такое сделать попроще - чё то я туплю
сергей1 (2004-08-10 13:34:00) [1]вот еще один вариант, не думаю, что лучше чем другие, но пусть будет, так, для разнообразия :)
select f2,f3 into #t1 from tab where f3='x'
select f2,f3 into #t2 from tab where f3='y'
select f2,f3 into #t3 from tab where f3='z'
select #t1.f2 from #t1
inner join #t2 on
#t1.f2 = #t2.f2
inner join #t3 on
#t2.f2 = #t3.f2
wild_arg (2004-08-10 10:44:00) [2]2 Sandman25
вспылил. был неправ. :)
проверил - действительно так. кто бы мог подумать
Sandman25 (2004-08-10 10:32:00) [3][26] wild_arg © (10.08.04 10:21)
Если коротко, то Вы ошибаетесь.
Например, null + a = null, верно. Но
если в столбце f1 имеем null и a, то sum(f1) = a. То есть в агрегатных функциях аргументы со значением null просто игнорируются, а не добавляются.
wild_arg (2004-08-10 10:21:00) [4]
> Sandman25 © (10.08.04 10:14) [25]
> [23] wild_arg © (10.08.04 10:13)
>
> Правильно, и условие не выполнится, поэтому f1 в выборку
> не попадет. Что и требовалось.
Неправильно и не требовалось.
смотри сам - возьмем элемент "а". Он встречается три раза.
a - x
a - y
a - z
Если мы уберем else, то наши суммы будут изменяться следующим образом
итерация | sum1 | sum2 | sum 3
------------------------------
1 1 Null Null
2 Null Null Null
3 Null Null Null
т.е. к концу запроса все три суммы обNULLятся и элемент "а" не пройдет по условию - а нам он нужен
Sandman25 (2004-08-10 10:14:00) [5][23] wild_arg © (10.08.04 10:13)
Правильно, и условие не выполнится, поэтому f1 в выборку не попадет. Что и требовалось.
Sandman25 (2004-08-10 10:13:00) [6][22] wild_arg © (10.08.04 10:11)
Не знаю, поэтому и не оценивал. Насколько я знаю, в MS SQL есть инструменты для просмотра плана выполнения запроса и для его оценки.
wild_arg (2004-08-10 10:13:00) [7]
>
> Sandman25 © (10.08.04 10:09) [21]
> [19] wild_arg © (10.08.04 10:01)
>
> Кстати, ветка else лишняя.
а мне не кажется. если ее убрать, то в некоторых случаях case будет возвращать Null - а тогда и вся сумма станет равна Null.
Так как, почему-то, <любое_число>+Null == Null
wild_arg (2004-08-10 10:11:00) [8]
> Sandman25 © (10.08.04 10:07) [20]
> [19] wild_arg © (10.08.04 10:01)
>
> Интересное решение. Но старайтесь найти не самое простое,
> а самое быстрое. Быстрое в плане скорости выполнения, а
> не написания или понимания.
хз конечно, но мне кажется, что с суммированием будет быстрее, чем с дополнительными подзапросами. как думаете?
Sandman25 (2004-08-10 10:09:00) [9][19] wild_arg © (10.08.04 10:01)
Кстати, ветка else лишняя.
Sandman25 (2004-08-10 10:07:00) [10][19] wild_arg © (10.08.04 10:01)
Интересное решение. Но старайтесь найти не самое простое, а самое быстрое. Быстрое в плане скорости выполнения, а не написания или понимания.
wild_arg (2004-08-10 10:01:00) [11]а я придумал так, и думал, что у меня сложно:
select
f1
from
table
group by
f1
having
sum(case f2 when 'x' then 1 else 0 end) >= 1 and
sum(case f2 when 'y' then 1 else 0 end) >= 1 and
sum(case f2 when 'z' then 1 else 0 end) >= 1
Silver Alex (2004-08-10 09:59:00) [12]должен извинится, запрос Sandman25 © (10.08.04 09:47) [10]
тоже верно написан
AleKo (2004-08-10 09:58:00) [13]Предлагаю сделать группировку по двум столбцам.
И далее подсчитать Count по первому столбцу, если = 3 то оставляем все остальное выбрасываем.
Silver Alex (2004-08-10 09:55:00) [14]>> wild_arg © (10.08.04 09:52) [12]
возьми запрос Silver Alex © (10.08.04 09:40) [7] скопируй и запусти, должен работать правильно.Потому что больше правильных ответов я не вижу
wild_arg (2004-08-10 09:55:00) [15]2 Sandman25 © (10.08.04 09:47) [10]
что-то типа того. но блин :) мудрено с дополнительными подзапросами, и не одним
а вопрос кажется таким простым
Sandman25 (2004-08-10 09:53:00) [16]Только что заметил, что это MSSQL...
Тогда можно иначе в случае неуникальности.
select f1
from
(
select distinct f1
from tab1
where f2 = 'x'
union all
select distinct f1
from tab1
where f2 = 'y'
union all
select distinct f1
from tab1
where f2 = 'z'
) a
group by f1
having count(*)=3
46_55_41_44 (2004-08-10 09:53:00) [17]ой блин!!!
Просто не прочитал внимательно вопрос! Извинтрест! Верните руку!
wild_arg (2004-08-10 09:52:00) [18]
> Соловьев © (10.08.04 09:47) [9]
>
> > Where (Field2 = 'x') or (Field2 = 'y') or (Field2 = 'z')!!!
>
> остался без руки - так как надо AND
а AND тож не прокатит. Так как в одной анализируемой строке - Field2 не может принимать разные значения
wild_arg (2004-08-10 09:50:00) [19]2 46_55_41_44
дык он просто тебе все записи из первоначалоьной таблицы вернет
Sandman25 (2004-08-10 09:47:00) [20]если (f1, f2)-уникально, то
select t1.f1
from tab1 t1,
tab1 t2,
tab1 t3
where t1.f2 = 'x'
and t2.f1 = t1.f1
and t2.f2 = 'y'
and t2.f1 = t1.f1
and t2.f2 = 'z'
если неуникально, то
select distinct f1
from tab1
where f1 in (select f1 from tab1 where f2='x')
and f1 in (select f1 from tab1 where f2='y')
and f1 in (select f1 from tab1 where f2='z')
или
select distinct F1
from Tab1 t1
where f2 = 'x'
and exists
(select 1
from tab1 t2
where t2.f1=t1.f1
and t2.f2='y')
and exists
(select 1
from tab1 t2
where t2.f1=t1.f1
and t2.f2='z')