Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Выборка [D6, MSSQL]


Страницы:   1 2

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')


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо