Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Пт Фев 29 2008 00:49 Заголовок сообщения: выбрать одинаковые записи: часть 2 |
|
|
Задача следующая. Есть таблица с двумя целочисленными полями. Есть так же буфер из неких целых чисел (не в таблице - в уме). Надо найти записи, где первое поле хранит одно из чисел буфера, а второе поле - число, которое встречается в записях для каждого другого числа из буфера.
Например, в буфере лежат числа 1, 2 и 4.
1) 1 1
2) 1 3
3) 2 1
4) 2 2
5) 2 3
6) 3 1
7) 3 5
8) 4 1
9) 4 3
Записи №№6 и 7 вообще нам не интересны, так как число из первого поля отсутствует в буфере.
Запись №4 не подходит, потому что число из второго поля не найдено для всех чисел буфера, указанных в первом поле.
Надеюсь, понятно объяснил. Меня, собственно, интересуют числа второго поля (в приведенном примере - это 1 и 3).
Варианты с вложенными запросами для каждого числа из буфера я имею в виду, но хотелось бы проверить, есть ли что-нибудь "по-практичнее". |
|
Вернуться к началу |
|
|
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Вс Мар 02 2008 01:27 Заголовок сообщения: |
|
|
На самом деле, до сегодняшнего дня я даже не догадывался, что Access (у меня база на Access'е) позволяет размещать вложенный запрос в блоке FROM! Как только узнал, не составило труда и решить свою задачку. Если кому надо, то:
select F2 from (select F2, count(F2) as c from (select F1, F2 where F1 in (B)) group by F2) where c = N
F1, F2 - первое и второе поля таблицы.
B - буфер; искомые числа первого поля через запятую.
N - длина буфера; кол-во искомых чисел.
Поясню. Сначала мы отбираем записи, первое поле которых содержит какое-либо число из буфера. Если брать пример заглавного поста, то мы получим записи с №1 по №5, №8 и №9. Далее из этой таблицы создаем другую: первый столбец - числа, встречающиеся во втором столбце таблицы, второй столбец - количество их вхождений. Получаем следующие записи: (1 3), (2 1), (3 3). Осталось из них выбрать записи, где значение второго поля равно значению чисел буфера (в нашем случае - 3). Таких записей две - (1 3) и (3 3). Теперь мы знаем, что со всеми числами из буфера в записях встречаются числа 1 и 3. |
|
Вернуться к началу |
|
|
|