Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
14-1092659199
Anekdot :o)!
2004-08-16 16:26
2004.09.05
:)))


4-1090322082
Le!
2004-07-20 15:14
2004.09.05
USB и работа с ним!


4-1090504357
Muchacho
2004-07-22 17:52
2004.09.05
как сопоставить номер каждому файлу в папке?


14-1092750205
Cosinus
2004-08-17 17:43
2004.09.05
Хм... А почему через стандартный OpenDialog нельзя открыть *.FON


1-1092910926
Cosinus
2004-08-19 14:22
2004.09.05
Обход всех секций в INI не зная точного их количества и имен