Выборка на основе данных одной таблицы

Eva_2006
Дата: 22.02.2007 11:56:51
Добрый день.
Возник вопрос.

Есть таблица my_table.

В таблице есть поля id, flag, person....

Для каждого person может быть несколько строк с различными значениями flag.

Требуется сделать выборку person, у которых есть flag = 4, но нет флагов = 1,48,34 и 9.

Как бы это сделать?

Обычно я использую внешнее объединение, если требуется найти с флагом 4, но без флага 1 (пример).

но ведь тогда сейчас будет 4 внешних объединения..... На сколько это плохо? таблица содержит огроменное количество строк!

Посоветуйте, пожалуйста.
Хм..
Дата: 22.02.2007 12:16:41
это плохо.. лучше так
select * from my_table t
where t.flag=4
  and not exists
      (select * from my_table tt
        where tt.peron=t.person
          and tt.flag not in (1,48,34, 9))
Михаил Панайот
Дата: 22.02.2007 12:21:46
Например,
select person
from my_table
where flag in (4, 1, 48, 34, 9)
group by person
having sum( decode( flag, 4, -1, 1 )) = -1
Elic
Дата: 22.02.2007 12:21:50
select person from my_table
  group by person
  having count(case when flag in (4)         then 0 end) > 0
     and count(case when flag in (1,48,34,9) then 0 end) = 0
Eva_2006
Дата: 22.02.2007 12:50:44
Всем спасибо за варианты. Попробую.

Вот только этот (заранее знаю) висит очень-очень долго и я так и не дождалась его выполнения.... А тот, что я предложила отрабатывает за 10 минут.

Хм..
это плохо.. лучше так
select * from my_table t
where t.flag=4
  and not exists
      (select * from my_table tt
        where tt.peron=t.person
          and tt.flag not in (1,48,34, 9))
Wladislaw
Дата: 22.02.2007 12:55:51
Eva_2006
Всем спасибо за варианты. Попробую.

Вот только этот (заранее знаю) висит очень-очень долго и я так и не дождалась его выполнения.... А тот, что я предложила отрабатывает за 10 минут.

Хм..
это плохо.. лучше так
select * from my_table t
where t.flag=4
  and not exists
      (select * from my_table tt
        where tt.peron=t.person
          and tt.flag not in (1,48,34, 9))


Ну положим этот запрос и отрабатывает неверно :). Not перед in лишний.
Elic
Дата: 22.02.2007 13:05:28
Eva_2006
Вот только этот (заранее знаю) висит очень-очень долго и я так и не дождалась его выполнения....
ХЕЗ, какие у тебя там индексы есть :)
Eva_2006
А тот, что я предложила отрабатывает за 10 минут.
Eva_2006
Обычно я использую внешнее объединение, если требуется найти с флагом 4, но без флага 1 (пример).
Ну так и используй одно + группировку:
on ... and flag in (1,48,34,9)
Хм..
Дата: 22.02.2007 13:12:09
2 Wladislaw: и то правда :)
2 Eva2006: если приведенная структура таблицы соответсвует действительной никак не может то что вы предложили отрабатывать быстрее того что я.. раза в два так.. или вы что-то скрываете?
Eva_2006
Дата: 22.02.2007 13:43:41
Elic
ХЕЗ, какие у тебя там индексы есть :)

Eva_2006
Обычно я использую внешнее объединение, если требуется найти с флагом 4, но без флага 1 (пример).
Ну так и используй одно + группировку:
on ... and flag in (1,48,34,9)


Elic, конечно, я привела не всю структуру. В действительности она намного сложнее.

Вопрос: А как при внешнем объединении использовать flag in (1,48,34,9)? Это ведь будет внешнее объединение, а значит после flag нужно ставить +, а плюс в данных выражениях недопустим... Или я опять не поняла?
Elic
Дата: 22.02.2007 13:52:28
Eva_2006
А как при внешнем объединении использовать flag in (1,48,34,9)? Это ведь будет внешнее объединение, а значит после flag нужно ставить +, а плюс в данных выражениях недопустим... Или я опять не поняла?
Никогда не слышала про ansi-join-ы? :)
Для не-ansi-join-ов STFF Что делает конструкция (+) ???