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: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 13:05:28
Eva_2006 |
Вот только этот (заранее знаю) висит очень-очень долго и я так и не дождалась его выполнения.... |
ХЕЗ, какие у тебя там индексы есть :)
Eva_2006 |
А тот, что я предложила отрабатывает за 10 минут. |
Eva_2006 |
Обычно я использую внешнее объединение, если требуется найти с флагом 4, но без флага 1 (пример). |
Ну так и используй одно + группировку:
on ... and flag in (1,48,34,9)
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 нужно ставить +, а плюс в данных выражениях недопустим... Или я опять не поняла?