powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / нужен опримальный запрос на выборку из связ. таблиц..
29 сообщений из 29, показаны все 2 страниц
нужен опримальный запрос на выборку из связ. таблиц..
    #32333833
vlad_707
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ситуация простая... объясню на пальцах.:
есть две таблицы справочника.: тСемья и тЧленыСемьи
тСемья
1___Ивановы
2___Петровы
3___Сидоровы

тЧленыСемьи
1___папа
2___мама
3___сестра
4___брат

и
тСвязка
1___1
1___2
1___3
2___1
2___2
3___1
3___2
3___3
3___4

Мне нужен запрос- вывести все семьи которые содержат одновременно папа,мама,сестра

Я нашёл 2 решения
1) при помощи EXISTS
2) создание копий таблицы тСвязка, поиск в каждой копии по одному члену семьи и связка таблиц по ключу семьи......

Но как мне кажется- это не остимальные и не самые быстрые способы выборки..
Подскажите стандартное и быстродейственное решение....
...
Рейтинг: 0 / 0
нужен опримальный запрос на выборку из связ. таблиц..
    #32333953
vlad_707
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм...ответа нет.....!?
Вам непонятен вопрос ???
Или
он кажется тривиальным ???
Или
наоборот- не хочется возиться?

Оставьте своё экспертное мнение, а лучше- экспертное решение вопроса.
...
Рейтинг: 0 / 0
нужен опримальный запрос на выборку из связ. таблиц..
    #32334092
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
SELECT t1.fam
FROM family t1 INNER JOIN flink t2 ON t1.id_fam = t2.id_fam
group by  t1.fam having sum(iif(t2.id_member= 1  or t2.id_member= 2  or t2.id_member= 3 , 1 , 0 ))>= 3 
...
Рейтинг: 0 / 0
нужен опримальный запрос на выборку из связ. таблиц..
    #32334096
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
VIG, а если три сестры? Тогда тоже сработает, а это неверно.
...
Рейтинг: 0 / 0
нужен опримальный запрос на выборку из связ. таблиц..
    #32334120
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну,"Три сестры" бывают только у Чехова
Код: plaintext
1.
2.
3.
4.
SELECT t1.fam
FROM family t1 INNER JOIN 
  (select distinct t2.id_fam, t2.id_member from flink  t2 where t2.id_member between  1  and  3 )  as t
on  t1.id_fam=t.id_fam
group by t1.fam having count(*)= 3 
...
Рейтинг: 0 / 0
нужен опримальный запрос на выборку из связ. таблиц..
    #32334159
vlad_707
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да...семей > 30000
членов семей порядка 2000 и более
каждая семья содержит около 10 членов
и выборка из семей может быть такая :
найти семьи с индетификаторами членовСемьи ( 2 ; 500 ; 2000 ;1520 и 77 ) одновременно соответственно.

Мне кажется - представленое мною проектирование базы является стандартным решением. И запрос должен быть стандартным, быстрым и простым.
...
Рейтинг: 0 / 0
нужен опримальный запрос на выборку из связ. таблиц..
    #32334236
vlad_707
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Саныч, Так сколько делать квасу??? 2 литра я уже обежал....
-) может мне побольше закваски делать??
Мне мой вопрос уже интерестен как спортивный интерес (конечно же я хочу найти оптимальное решение ) , но неужели на такое простое построение базы (причём оно применяется повсеместно) требуется придумывать "извращённые" запросы....
или это уже не стандартное решение!??
или по вторникам знатоки аксесс не заходят в форум....?
...
Рейтинг: 0 / 0
нужен опримальный запрос на выборку из связ. таблиц..
    #32334310
CtrlAlt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Создаешь табличку тНайти, в которую записываешь требуемые идентификаторы (2 ; 500 ; 2000 ;1520 и 77).

2. Перемножаешь таблицу тСемья с таблицей тНайти:
Код: plaintext
1.
SELECT * FROM тНайти,тСемья

Запрос выполняется достаточно быстро. Сохраняешь запрос.

3. Линкуешь со своей таблицей тСвязка по двум полям. Получаешь требуемый набор семей.

4. Группируешь его и фсё.

Все это можно сделать на сохраненных запросах. Нужно только менять записи в таблице тНайти и можно сразу получать результат.
...
Рейтинг: 0 / 0
нужен опримальный запрос на выборку из связ. таблиц..
    #32334350
vlad_707
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CtrlAlt
Пардон, не понял , что значит группируешь??? (шаг 4)
как я понимаю на 3 шаге получается все семьи в которых присутствует хотя бы один член из "найти".........
...
Рейтинг: 0 / 0
нужен опримальный запрос на выборку из связ. таблиц..
    #32334361
CtrlAlt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не хотя бы один член, а все, которые указаны в тНайти (а также те семьи, в которых помимо этих членов могут быть какие-то другие)

А на 3-ем шаге у тебя получится что-то типа

3_2
3_500
3_2000
3_1520
3_77
..
1113_2
1113_500
1113_2000
1113_1520
1113_77

А тебе нужен только сгруппированный первый столбец, что и делается в шаге 4
...
Рейтинг: 0 / 0
нужен опримальный запрос на выборку из связ. таблиц..
    #32334378
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
vlad_707 писал:Владимир Саныч, Так сколько делать квасу??? 2 литра я уже обежал....
А чего это, чуть что, сразу я... А что это за квас, который обегают?
...
Рейтинг: 0 / 0
нужен опримальный запрос на выборку из связ. таблиц..
    #32334388
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 vlad_707
Значит ты не знаешь что такое "извращенный запрос"
2 CtrAlt
4. Группируешь его и фсё.
Да не фсё. Надо будет еще из каждой группы отобрать те ,у которых к-во членов в группе равно количеству строк в таблице Найти
И зачем делать декартово произведение таблиц ,когда достаточно простого Inner Join между Найти и тЧленыСемьи
...
Рейтинг: 0 / 0
нужен опримальный запрос на выборку из связ. таблиц..
    #32334406
CtrlAlt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да не фсё. Надо будет еще из каждой группы отобрать те ,у которых к-во членов в группе равно количеству строк в таблице Найти

В задаче vlad_707 явно не указано, строгое должно быть соответствие или в семьях могут быть какие-нибудь еще другие члены. Более логичен второй вариант (как у меня), например, нужно найти семьи в которых есть сестра. В таком случае по твоему способу вообще не найдется никаких записей. Но, конечно, это только мои предположения. Один вариант из другого легко получить.


И зачем делать декартово произведение таблиц ,когда достаточно простого Inner Join между Найти и тЧленыСемьи

Как я понял, в тЧленыСемьи нет указания на семью, есть только в тСвязка.
...
Рейтинг: 0 / 0
нужен опримальный запрос на выборку из связ. таблиц..
    #32334420
CtrlAlt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то да, можно по-проще сделать

1. Связать таблицу тСвязка(по второму полю) с тНайти
2. Сгруппировать получившийся запрос по первому полю с Count по второму

Условие на Count = кол-во записей в тНайти - для четкого соответствия
Условие на Count >= кол-во записей в тНайти - для нечеткого соответствия (т.е. в семья могут быть и другие члены)
...
Рейтинг: 0 / 0
нужен опримальный запрос на выборку из связ. таблиц..
    #32334434
vlad_707
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В.С.
обежал=обещал..... ( -) перелёт в обещание не входит..)
ViG- спасибо, идею с каунтом понял.
CtrlAlt - делал как вы говорите раньше...не получилось... , с каунтом и табличкой получится...
теперь осталось проверить - будет ли это быстрее ранее сделанных способов.
(мне кажется должно работать быстрее)
...
Рейтинг: 0 / 0
нужен опримальный запрос на выборку из связ. таблиц..
    #32334439
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как я понял, в тЧленыСемьи нет указания на семью, есть только в тСвязка
Я и имел в виду тСвязка, тЧленыСемьи - это просто описка.
Что же касается
В задаче vlad_707 явно не указано, строгое должно быть соответствие или в семьях могут быть какие-нибудь еще другие члены. Более логичен второй вариант (как у меня), например, нужно найти семьи в которых есть сестра. В таком случае по твоему способу вообще не найдется никаких записей . -
то позволю не согласиться
Во первых vlad_707 ясно указал , что ему нужны семьи с составом родственником не меньше ,чем указано в критерии поиска. И мои варианты раз такие семьи находят (Просто в запросе от 13:17 надо заменить between на in(перечень_требуемых_родственников)
Твой же вариант найдет семьи в которых есть хотя бы один из указанных родственников,что ,имхо, не есть правильно.
...
Рейтинг: 0 / 0
нужен опримальный запрос на выборку из связ. таблиц..
    #32334440
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Сейчас вставлю свои 3 копейки, может еще пол-литра кваса заработаю...

Запрос 1: group by по номеру семьи и члену семьи и фильтр по 1-2-3.

Запрос 2: из предыдущего запроса group by по номеру семьи и фильтр where count=3.

Если это совпадает с каким-нибудь решением, предложенным раньше, то звиняйте.
...
Рейтинг: 0 / 0
нужен опримальный запрос на выборку из связ. таблиц..
    #32334455
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саныч,я тебя конечно звыняю, но это дословный перевод на русский моего запроса от 13:17
...
Рейтинг: 0 / 0
нужен опримальный запрос на выборку из связ. таблиц..
    #32334463
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Неееет, VIG, твой вариант отличается от моего. У меня групбаев двое.
...
Рейтинг: 0 / 0
нужен опримальный запрос на выборку из связ. таблиц..
    #32334465
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 CtrAlt
Условие на Count >= кол-во записей в тНайти - для нечеткого соответствия (т.е. в семья могут быть и другие члены)
Это лишнее.Никогда не будет Count > кол-во записей в тНайти ,так как
"другие члены " просто не попадут в выборку
...
Рейтинг: 0 / 0
нужен опримальный запрос на выборку из связ. таблиц..
    #32334470
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даааа Саныч, у меня в подзапросе Distinct ,что в данном случае эквивалентно Group By
...
Рейтинг: 0 / 0
нужен опримальный запрос на выборку из связ. таблиц..
    #32334473
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
:^) Ну и ладно. Забираю свои 3 копейки обратно.
...
Рейтинг: 0 / 0
нужен опримальный запрос на выборку из связ. таблиц..
    #32334477
CtrlAlt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(c)VIG

Ага, я уже догадался.

Этот каунт, нужно считать в отдельном запросе. А затем прилинковывать его к результату. И там смотреть эти условия. Если нужно нечеткое соответствие (т.е. в семье могут быть и другие члены), то этот отдельный запрос необязателен, можно обойтись одним.
...
Рейтинг: 0 / 0
нужен опримальный запрос на выборку из связ. таблиц..
    #32334511
vlad_707
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо ,я мысль с каунтом понял, проверил, всё работает..
пока ,как мне кажется- это оптимальное решение. (конечно проверить нада на время выборки)
В.С. спасибо.....-)) я ужо дошел сам про каунт вига (с группировками) до твоего ответа... (так что пол-литра отменяются....-)..)
Но как вы думаете- это самое оптимальное (всмысле быстрое) решение или одно из решений
делаются 2 группировки по > 300 000 записям + програмное определение количества членов семьи или создание таблицы где будет список интересующих значений и каунт по нему..
( топик написал давно...-( ..забыл отправить...)
...
Рейтинг: 0 / 0
нужен опримальный запрос на выборку из связ. таблиц..
    #32334522
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но как вы думаете- это самое оптимальное (всмысле быстрое) решение...
Опыт-критерий истины
Но думаю ,если правильно настроить индексы, то будет работь достаточно быстро
...
Рейтинг: 0 / 0
нужен опримальный запрос на выборку из связ. таблиц..
    #32334600
1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select
family.name ,
count(*)
from
family
inner join
familymember f1
on ( family.ID = f1.familyID )
inner join
familymember f2
on ( family.ID = f2.familyID )
inner join
familymember f3
on ( family.ID = f3.familyID )
where
f1.memberid = 1 and
f2.memberid = 2 and
f3.memberid = 3
group by
family.name

Получаем все семьи где есть хотя бы один папа, хотя бы одна мама, хотя бы одна сестра. Если нужны семьи без лишних пап, мам и сестер, потом фильтруем по count=1
...
Рейтинг: 0 / 0
нужен опримальный запрос на выборку из связ. таблиц..
    #32334656
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to 1
Все правильно. Но что делать если надо будет найти 4,5.... членов семьи?
Каждый раз переписывать запрос заново?
...
Рейтинг: 0 / 0
нужен опримальный запрос на выборку из связ. таблиц..
    #32334967
vlad_707
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я писал :
Мне нужен запрос- вывести все семьи которые содержат одновременно папа,мама,сестра

Я нашёл 2 решения
1) при помощи EXISTS
2) создание копий таблицы тСвязка, поиск в каждой копии по одному члену семьи и связка таблиц по ключу семьи......


Правильно ли я понял, что предложение 1, guest является модификацией моего решения 2)
...
Рейтинг: 0 / 0
нужен опримальный запрос на выборку из связ. таблиц..
    #32335854
1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильно, только одним запросом :)
Ну и конечно решение не универсальное, никто и не говорил.
Я кстати думаю, что по скорости оно будет оптимальным, во всяком случае при трех таблицах.
...
Рейтинг: 0 / 0
29 сообщений из 29, показаны все 2 страниц
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / нужен опримальный запрос на выборку из связ. таблиц..
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]