Здравствуйте, MasterZiv, Вы писали:
MZ>white_znake пишет:
>> надо отобрать NoteID для которых FragmentID = 1, 4 и 5, т.е. выбрать >> NoteID — 1
MZ>select * from Fragments where NoteID = 1
Не, не катит
Нужно выбирать NoteID по заданным FragmentID
Здравствуйте, 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
Здравствуйте, 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
Тогда Вам поможет только решение Toughpheeckouse — оно верное при условии уникальности NoteID
Если NoteID будет не уникален для тройки значений FragmentID, тогда нужно будет вводить дополнительный критерий типа минимального/максимального значения.
то и ваше решение вернeт не одну строку. В этом случае, решение Toughpheeckouse будет эффективнее, так как having будет работать быстрее, чем трижды соединять таблицу с самой собой, особенно если там миллионы строк и не только эти атрибуты.
Здравствуйте, 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