Текущий архив: 2004.09.05;
Скачать: CL | DM;
Вниз
Выборка Найти похожие ветки
← →
wild_arg © (2004-08-10 09:26) [0]Eсть таблица :
_____
a | x
b | y
a | y
c | z
b | x
b | z
a | z
Надо выбрать только те элементы из первого столбца, которые встречаются в таблице и с "x", и с "у", и с "z"
т.е. результатом будет:
a
b
как такое сделать попроще - чё то я туплю
← →
Sandman25 © (2004-08-10 09:28) [1]одна таблица используется 3 раза с разными алиасами
← →
Соловьев © (2004-08-10 09:29) [2]select field1
from table
group by field1
having count(field2)=3
или
select field1
from table
where field2 in ("x","y","z")
← →
Соловьев © (2004-08-10 09:31) [3]
> select field1
> from table
> where field2 in ("x","y","z")
неа, надо через AND
← →
Sandman25 © (2004-08-10 09:31) [4][2] Соловьев © (10.08.04 09:29)
Второй вариант ошибочен.
← →
Соловьев © (2004-08-10 09:32) [5]
> Второй вариант ошибочен.
да и первый, что-то я не проснулся:)
← →
Sandman25 © (2004-08-10 09:33) [6]:)
Я, наверное, тоже не проснулся - лень было полный ответ написать.
← →
Silver Alex © (2004-08-10 09:40) [7]может быть так?
select t1.Field1 from Table t1
where
exists (select t2.field1 from table t2
where
t2.field1=t1.field1
and t2.field2 ="x"
)
and exists (select t3.field1 from table t3
where
t3.field1=t1.field1
and t3.field2="y"
)
and exists (select t4.field1 from table t4
where
t4.field1=t1.field1
and t4.field2 ="z"
)
← →
46_55_41_44 © (2004-08-10 09:44) [8]Слушайте народ вы чего мучаетесь?
Это же просто как 2Х2...
Select Field1 from Table1
Where (Field2 = "x") or (Field2 = "y") or (Field2 = "z")!!!
Будет работать!
Даю руку на отсечение!!!
← →
Соловьев © (2004-08-10 09:47) [9]
> Where (Field2 = "x") or (Field2 = "y") or (Field2 = "z")!!!
остался без руки - так как надо AND
← →
Sandman25 © (2004-08-10 09:47) [10]если (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")
← →
wild_arg © (2004-08-10 09:50) [11]246_55_41_44
дык он просто тебе все записи из первоначалоьной таблицы вернет
← →
wild_arg © (2004-08-10 09:52) [12]
> Соловьев © (10.08.04 09:47) [9]
>
> > Where (Field2 = "x") or (Field2 = "y") or (Field2 = "z")!!!
>
> остался без руки - так как надо AND
а AND тож не прокатит. Так как в одной анализируемой строке - Field2 не может принимать разные значения
← →
46_55_41_44 © (2004-08-10 09:53) [13]ой блин!!!
Просто не прочитал внимательно вопрос! Извинтрест! Верните руку!
← →
Sandman25 © (2004-08-10 09:53) [14]Только что заметил, что это 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
← →
Silver Alex © (2004-08-10 09:55) [15]>> wild_arg © (10.08.04 09:52) [12]
возьми запрос Silver Alex © (10.08.04 09:40) [7] скопируй и запусти, должен работать правильно.Потому что больше правильных ответов я не вижу
← →
wild_arg © (2004-08-10 09:55) [16]2Sandman25 © (10.08.04 09:47) [10]
что-то типа того. но блин :) мудрено с дополнительными подзапросами, и не одним
а вопрос кажется таким простым
← →
AleKo (2004-08-10 09:58) [17]Предлагаю сделать группировку по двум столбцам.
И далее подсчитать Count по первому столбцу, если = 3 то оставляем все остальное выбрасываем.
← →
Silver Alex © (2004-08-10 09:59) [18]должен извинится, запрос Sandman25 © (10.08.04 09:47) [10]
тоже верно написан
← →
wild_arg © (2004-08-10 10:01) [19]а я придумал так, и думал, что у меня сложно:
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
← →
Sandman25 © (2004-08-10 10:07) [20][19] wild_arg © (10.08.04 10:01)
Интересное решение. Но старайтесь найти не самое простое, а самое быстрое. Быстрое в плане скорости выполнения, а не написания или понимания.
← →
Sandman25 © (2004-08-10 10:09) [21][19] wild_arg © (10.08.04 10:01)
Кстати, ветка else лишняя.
← →
wild_arg © (2004-08-10 10:11) [22]
> Sandman25 © (10.08.04 10:07) [20]
> [19] wild_arg © (10.08.04 10:01)
>
> Интересное решение. Но старайтесь найти не самое простое,
> а самое быстрое. Быстрое в плане скорости выполнения, а
> не написания или понимания.
хз конечно, но мне кажется, что с суммированием будет быстрее, чем с дополнительными подзапросами. как думаете?
← →
wild_arg © (2004-08-10 10:13) [23]
>
> Sandman25 © (10.08.04 10:09) [21]
> [19] wild_arg © (10.08.04 10:01)
>
> Кстати, ветка else лишняя.
а мне не кажется. если ее убрать, то в некоторых случаях case будет возвращать Null - а тогда и вся сумма станет равна Null.
Так как, почему-то, <любое_число>+Null == Null
← →
Sandman25 © (2004-08-10 10:13) [24][22] wild_arg © (10.08.04 10:11)
Не знаю, поэтому и не оценивал. Насколько я знаю, в MS SQL есть инструменты для просмотра плана выполнения запроса и для его оценки.
← →
Sandman25 © (2004-08-10 10:14) [25][23] wild_arg © (10.08.04 10:13)
Правильно, и условие не выполнится, поэтому f1 в выборку не попадет. Что и требовалось.
← →
wild_arg © (2004-08-10 10:21) [26]
> 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:32) [27][26] wild_arg © (10.08.04 10:21)
Если коротко, то Вы ошибаетесь.
Например, null + a = null, верно. Но
если в столбце f1 имеем null и a, то sum(f1) = a. То есть в агрегатных функциях аргументы со значением null просто игнорируются, а не добавляются.
← →
wild_arg © (2004-08-10 10:44) [28]2Sandman25
вспылил. был неправ. :)
проверил - действительно так. кто бы мог подумать
← →
сергей1 (2004-08-10 13:34) [29]вот еще один вариант, не думаю, что лучше чем другие, но пусть будет, так, для разнообразия :)
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
Страницы: 1 вся ветка
Текущий архив: 2004.09.05;
Скачать: CL | DM;
Память: 0.54 MB
Время: 0.059 c