хитрый select
От: white_znake  
Дата: 06.02.09 13:20
Оценка:
Здравствуйте, уважаемые коллеги

Есть таблица:

Fragments:

NoteID FragmentID
1 1
1 4
1 5
2 2
2 5
3 1
3 7

надо отобрать NoteID для которых FragmentID = 1, 4 и 5, т.е. выбрать NoteID — 1
Re: хитрый select
От: sunsquirel США  
Дата: 06.02.09 13:31
Оценка:
Здравствуйте, white_znake, Вы писали:

_>Здравствуйте, уважаемые коллеги


_>Есть таблица:


_>Fragments:


_>NoteID FragmentID

_>1 1
_>1 4
_>1 5
_>2 2
_>2 5
_>3 1
_>3 7

_>надо отобрать NoteID для которых FragmentID = 1, 4 и 5, т.е. выбрать NoteID — 1



Простите, а что тут хитрого?


SELECT DISTINCT NoteID
FROM Fragments
WHERE FragmentID in (1,4,5)
Re[2]: хитрый select
От: Tissot Россия  
Дата: 06.02.09 13:34
Оценка:
Здравствуйте, sunsquirel, Вы писали:

S>Простите, а что тут хитрого?


S>
S>SELECT DISTINCT NoteID
S>FROM Fragments
S>WHERE FragmentID in (1,4,5)
S>



А ничего, что ваш код возвращает 1, 2, 3?
Re: хитрый select
От: MasterZiv СССР  
Дата: 06.02.09 13:38
Оценка: :))
white_znake пишет:

> надо отобрать NoteID для которых FragmentID = 1, 4 и 5, т.е. выбрать

> NoteID — 1

select * from Fragments where NoteID = 1
Posted via RSDN NNTP Server 2.1 beta
Re[2]: хитрый select
От: white_znake  
Дата: 06.02.09 13:45
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>white_znake пишет:


>> надо отобрать NoteID для которых FragmentID = 1, 4 и 5, т.е. выбрать

>> NoteID — 1

MZ>select * from Fragments where NoteID = 1


Не, не катит
Нужно выбирать NoteID по заданным FragmentID
Re[2]: хитрый select
От: white_znake  
Дата: 06.02.09 13:47
Оценка:
Здравствуйте, sunsquirel, Вы писали:

S>Здравствуйте, white_znake, Вы писали:


_>>Здравствуйте, уважаемые коллеги


_>>Есть таблица:


_>>Fragments:


_>>NoteID FragmentID

_>>1 1
_>>1 4
_>>1 5
_>>2 2
_>>2 5
_>>3 1
_>>3 7

_>>надо отобрать NoteID для которых FragmentID = 1, 4 и 5, т.е. выбрать NoteID — 1



S>Простите, а что тут хитрого?



S>
S>SELECT DISTINCT NoteID
S>FROM Fragments
S>WHERE FragmentID in (1,4,5)
S>


У вас получается что выбираются NoteID у которых FragmentID либо 1, либо 4, либо 5
А надо выбрать NoteID у которых FragmentID 1 и 4 и 5

Я же сказал — "хитрый select"
Re[3]: хитрый select
От: sunsquirel США  
Дата: 06.02.09 13:56
Оценка:
Здравствуйте, white_znake, Вы писали:

_>>>надо отобрать NoteID для которых FragmentID = 1, 4 и 5, т.е. выбрать NoteID — 1


S>>
S>>SELECT DISTINCT NoteID
S>>FROM Fragments
S>>WHERE FragmentID in (1,4,5)
S>>


_>У вас получается что выбираются NoteID у которых FragmentID либо 1, либо 4, либо 5

_>А надо выбрать NoteID у которых FragmentID 1 и 4 и 5

_>Я же сказал — "хитрый select"


Тогда так:
Если будет много значений, то скорее всего надо будет вместе и DISTINCT, и MIN
SELECT MIN(NoteID)
FROM Fragments
WHERE FragmentID in (1,4,5)
GROUP BY
Re[4]: хитрый select
От: sunsquirel США  
Дата: 06.02.09 13:57
Оценка:
Здравствуйте, sunsquirel, Вы писали:

Группировка лишняя
S>
S>SELECT MIN(NoteID)
S>FROM Fragments
S>WHERE FragmentID in (1,4,5)
S>
Re[5]: хитрый select
От: white_znake  
Дата: 06.02.09 14:19
Оценка:
Здравствуйте, sunsquirel, Вы писали:

S>Здравствуйте, sunsquirel, Вы писали:


S>Группировка лишняя

S>>
S>>SELECT MIN(NoteID)
S>>FROM Fragments
S>>WHERE FragmentID in (1,4,5)
S>>


Ну да если вариант данных
NoteID FragmentID
1 2
1 4
1 5
2 1
2 4
2 5
3 1
3 4

То ваш запрос вернет NoteID — 1, а должен вернуть 2
Re: хитрый select
От: Toughpheeckouse Россия  
Дата: 06.02.09 14:21
Оценка:
Здравствуйте, white_znake, Вы писали:

_>Здравствуйте, уважаемые коллеги


_>Есть таблица:


_>Fragments:


_>NoteID FragmentID

_>1 1
_>1 4
_>1 5
_>2 2
_>2 5
_>3 1
_>3 7

_>надо отобрать NoteID для которых FragmentID = 1, 4 и 5, т.е. выбрать NoteID — 1



select
    t.NoteID
from t1 t
where t.FragmentID in (1, 4, 5)
group by t.NoteID
having count(*) = 3


Если у тебя пара (NoteID, FragmentID) уникальная, то будет работать этот запрос.
Если не уникальна, то другой запрос нужен
Думайте сами, решайте сами...
Re[2]: хитрый select
От: white_znake  
Дата: 06.02.09 15:49
Оценка:
Здравствуйте, Toughpheeckouse, Вы писали:

T>Здравствуйте, white_znake, Вы писали:


_>>Здравствуйте, уважаемые коллеги


_>>Есть таблица:


_>>Fragments:


_>>NoteID FragmentID

_>>1 1
_>>1 4
_>>1 5
_>>2 2
_>>2 5
_>>3 1
_>>3 7

_>>надо отобрать NoteID для которых FragmentID = 1, 4 и 5, т.е. выбрать NoteID — 1



T>
T>select
T>    t.NoteID
T>from t1 t
T>where t.FragmentID in (1, 4, 5)
T>group by t.NoteID
T>having count(*) = 3
T>


T>Если у тебя пара (NoteID, FragmentID) уникальная, то будет работать этот запрос.

T>Если не уникальна, то другой запрос нужен

я уже пробовал, но пары у меня не уникальные
Re: хитрый select
От: white_znake  
Дата: 06.02.09 15:51
Оценка:
Здравствуйте, white_znake, Вы писали:

_>Здравствуйте, уважаемые коллеги


_>Есть таблица:


_>Fragments:


_>NoteID FragmentID

_>1 1
_>1 4
_>1 5
_>2 2
_>2 5
_>3 1
_>3 7

_>надо отобрать NoteID для которых FragmentID = 1, 4 и 5, т.е. выбрать NoteID — 1


Решение вот какое:

Select Distinct T1.NoteID
    From Fragments T1 Inner Join Fragments T2 On T1.NoteID = T2.NoteID And 
    T1.FragmentID = 1 And T2.FragmentID = 4 Inner Join Fragments T3 On T1.NoteID = T3.NoteID And
    T3.FragmentID = 5
Re[6]: хитрый select
От: sunsquirel США  
Дата: 06.02.09 15:53
Оценка:
_>Здравствуйте, sunsquirel, Вы писали:

Тогда Вам поможет только решение Toughpheeckouse — оно верное при условии уникальности NoteID
Если NoteID будет не уникален для тройки значений FragmentID, тогда нужно будет вводить дополнительный критерий типа минимального/максимального значения.
Re[2]: хитрый select
От: Toughpheeckouse Россия  
Дата: 06.02.09 15:59
Оценка:
Здравствуйте, white_znake, Вы писали:

_>Решение вот какое:


_>
_>Select Distinct T1.NoteID
_>    From Fragments T1 Inner Join Fragments T2 On T1.NoteID = T2.NoteID And 
_>    T1.FragmentID = 1 And T2.FragmentID = 4 Inner Join Fragments T3 On T1.NoteID = T3.NoteID And
_>    T3.FragmentID = 5
_>



Сделай вариант с exists и не нужно будет distinct.
Думайте сами, решайте сами...
Re[2]: хитрый select
От: sunsquirel США  
Дата: 06.02.09 16:04
Оценка:
Здравствуйте, white_znake, Вы писали:

_>Решение вот какое:


_>
_>Select Distinct T1.NoteID
_>    From Fragments T1 Inner Join Fragments T2 On T1.NoteID = T2.NoteID And 
_>    T1.FragmentID = 1 And T2.FragmentID = 4 Inner Join Fragments T3 On T1.NoteID = T3.NoteID And
_>    T3.FragmentID = 5
_>


Если набор неуникален, например:
NoteID FragmentID
1 1
1 4
1 5
2 2
2 5
2 4
2 1
3 1
3 7

то и ваше решение вернeт не одну строку. В этом случае, решение Toughpheeckouse будет эффективнее, так как having будет работать быстрее, чем трижды соединять таблицу с самой собой, особенно если там миллионы строк и не только эти атрибуты.
Re[3]: хитрый select
От: anddros  
Дата: 06.02.09 16:11
Оценка:
Здравствуйте, white_znake, Вы писали:

_>Здравствуйте, Toughpheeckouse, Вы писали:


T>>Здравствуйте, white_znake, Вы писали:


_>>>Здравствуйте, уважаемые коллеги


_>>>Есть таблица:


_>>>Fragments:


_>>>NoteID FragmentID

_>>>1 1
_>>>1 4
_>>>1 5
_>>>2 2
_>>>2 5
_>>>3 1
_>>>3 7

_>>>надо отобрать NoteID для которых FragmentID = 1, 4 и 5, т.е. выбрать NoteID — 1



T>>
T>>select
T>>    t.NoteID
T>>from t1 t
T>>where t.FragmentID in (1, 4, 5)
T>>group by t.NoteID
T>>having count(*) = 3
T>>


T>>Если у тебя пара (NoteID, FragmentID) уникальная, то будет работать этот запрос.

T>>Если не уникальна, то другой запрос нужен

_>я уже пробовал, но пары у меня не уникальные


select
    t.NoteID
from t1 t
where t.FragmentID in (1, 4, 5)
group by t.NoteID
having count(distinct t.FragmentID) = 3
Re: хитрый select
От: bastrakov Россия http://bastrakof.livejournal.com/
Дата: 10.02.09 15:49
Оценка:
Здравствуйте, white_znake, Вы писали:

_>Есть таблица:

_>Fragments:
_>NoteID FragmentID
_>1 1
_>1 4
_>1 5
_>2 2
_>2 5
_>3 1
_>3 7
_>надо отобрать NoteID для которых FragmentID = 1, 4 и 5, т.е. выбрать NoteID — 1

не проверял. (Oracle)

select NoteID from Fragments
where FragmentID in (1,4,5)
MINUS
select NoteID from Fragments
where FragmentID not in (1,4,5);

bo
Re: хитрый select
От: JustasVred  
Дата: 12.02.09 17:52
Оценка:
Здравствуйте, white_znake, Вы писали:

_>Здравствуйте, уважаемые коллеги


_>Есть таблица:


_>Fragments:


_>NoteID FragmentID

_>1 1
_>1 4
_>1 5
_>2 2
_>2 5
_>3 1
_>3 7

_>надо отобрать NoteID для которых FragmentID = 1, 4 и 5, т.е. выбрать NoteID — 1



Можно так:

Select NoteId, count(distinct FragmentID) from Fragments
where FragmentID IN (1,4,5)
GROUP by NoteId
HAVING count(*) = 3;
Re[2]: хитрый select
От: JustasVred  
Дата: 12.02.09 17:57
Оценка:
Здравствуйте, JustasVred, Вы писали:

JV>Здравствуйте, white_znake, Вы писали:


_>>Здравствуйте, уважаемые коллеги


_>>Есть таблица:


_>>Fragments:


_>>NoteID FragmentID

_>>1 1
_>>1 4
_>>1 5
_>>2 2
_>>2 5
_>>3 1
_>>3 7

_>>надо отобрать NoteID для которых FragmentID = 1, 4 и 5, т.е. выбрать NoteID — 1


Ашибся немножко, правильно будет вот так:

Select NoteId, count(distinct FragmentID) from Fragments
where FragmentID IN (1,4,5)
GROUP by NoteId
HAVING count(distinct FragmentID) = 3;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.