powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Составить запросик...
25 сообщений из 27, страница 1 из 2
Составить запросик...
    #32438550
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть две таблички...
tblArtikul и tblModelsInArtikul (1--8)
с данными:
tblArtikul:
Код: plaintext
1.
2.
Id_Artikul	Artikul
 3 	K001N001T1
 5 	K001N040T1
tblModelsInArtikul
Код: plaintext
1.
2.
3.
4.
Id_Artikul	ModelInArt
 3 	N001
 3 	P001
 5 	N040
 5 	P001

Надо как сделать кокое-нить условие шоб показал все артикула где присутсвуют 2 модели N040 и P001, но только те где присутсвуют обе модели, т.е. в данном случае артикул K001N040T1
на кол-во моделей не хотелось бы завязываться

Сделать можно всё!!!
Только бы знать как...
...
Рейтинг: 0 / 0
Составить запросик...
    #32438567
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
...where count(*)=2
...
Рейтинг: 0 / 0
Составить запросик...
    #32438599
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
А точнее:

SELECT tblArtikul.Artikul
FROM tblArtikul INNER JOIN tblModelsInArtikul ON tblArtikul.Id_Artikul = tblModelsInArtikul.Id_Artikul
WHERE (((tblModelsInArtikul.ModelInArt) In ('N040','P001')))
GROUP BY tblArtikul.Artikul
HAVING (((Count(tblArtikul.Artikul))=2));

То, что выделено красным, надо менять динамически.
...
Рейтинг: 0 / 0
Составить запросик...
    #32438607
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
объявляю себе пятницу

не проверяя, что в календаре

SELECT DISTINCT tblArtikul.Artikul
FROM tblArtikul RIGHT JOIN tblModelsInArtikul
ON (tblArtikul.ID_Artikul=tblModelsInArtikul.Id_Artikul
AND (tblModelsInArtikul.ModelInArt="N040" OR tblModelsInArtikul.ModelInArt="P001"))
...
Рейтинг: 0 / 0
Составить запросик...
    #32438616
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
лажанулся малость - действительно, сказано надо обе
ПАРДОНС
...
Рейтинг: 0 / 0
Составить запросик...
    #32439118
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 ВС
надеялся что можно как нить по другому без Count... абыдна...
а что лучше (((tblModelsInArtikul.ModelInArt) In ('N040','P001')))
или tblModelsInArtikul.ModelInArt='N040' AND tblModelsInArtikul.ModelInArt='P001'?

Сделать можно всё!!!
Только бы знать как...
...
Рейтинг: 0 / 0
Составить запросик...
    #32439178
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как всегда напутал...
читай
tblModelsInArtikul.ModelInArt='N040' OR tblModelsInArtikul.ModelInArt='P001'?

Сделать можно всё!!!
Только бы знать как...
...
Рейтинг: 0 / 0
Составить запросик...
    #32440619
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Если генерить этот селект автоматом, то in проще. :^)
...
Рейтинг: 0 / 0
Составить запросик...
    #32440649
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотели решение как нить по другому без Count.. - их есть у меня :)

Код: plaintext
1.
2.
3.
4.
5.
select a.Artikul
from tblModelsInArtikul t inner join tblArtikul  a
on t.Id_Artikul =a.Id_Artikul 
where t.ModelInArt='N040'
and exists 
(select * from tblModelsInArtikul t2 where t2.Id_Artikul =t.Id_Artikul and t2.ModelInArt='P001')
...
Рейтинг: 0 / 0
Составить запросик...
    #32440652
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
VIG, тебе полагается звание Виртуоз SQL'я.
...
Рейтинг: 0 / 0
Составить запросик...
    #32440663
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага, с добавлением - "плохознающий Access"
Саныч, настоящие виртуозы SQL здесь , а я так ,"еще только учусь..."
...
Рейтинг: 0 / 0
Составить запросик...
    #32440665
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
При чем тут Аксесс? Ты на одном SQL'е можешь сваять что угодно.
...
Рейтинг: 0 / 0
Составить запросик...
    #32440688
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При чем тут Аксесс?
Действительно, о чем это я ? ( из какого-то КВНа)
Спасибо, Саныч ! Твои бы слова да моему работодателю в уши ...
З.Ы А твоя фирма мне так и не ответила. Ей (фирме ) очевидно нужны только виртуозы Аксесса .
...
Рейтинг: 0 / 0
Составить запросик...
    #32440689
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Моя фирма не ответила еще 10 или 20 человекам, CV которых я приносил.
...
Рейтинг: 0 / 0
Составить запросик...
    #32440704
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему не так:
Код: plaintext
1.
2.
3.
4.
select a.* 
from 
(tblArtikul as a inner join tblModelsInArtikul as b on a.id_Artikul=b.id_Artikul)
inner join tblModelsInArtikul as c on a.id_Artikul=c.id_Artikul
where b.ModelInArt= "N040"  and c.ModelInArt= "P001" ;

?
:)
...
Рейтинг: 0 / 0
Составить запросик...
    #32440718
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Geo
"И ты то же прав" ( из старого еврейского анекдота)
...
Рейтинг: 0 / 0
Составить запросик...
    #32440721
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот тогда и я спрошу.

Про "exist" не скажу - с ходу не придумаю, а вот зачем нужны "in" и "not in"?
Кроме того как "для облегчения понимания текста запроса"?
Я не могу придумать запрос, в котором эти операторы нельзя было бы заменить на один из join ... where. И выполняться последние будут в худшем случае не медленнее.
...
Рейтинг: 0 / 0
Составить запросик...
    #32440727
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а вот зачем нужны "in" и "not in"?

Вопрос скорее к разработчикам стандарта
Точно так же можно спросить зачем нужен Between, когда прекрасно можно обойтись >= and <=
Имхо, это сделано для совместимости с различными системами которые , были разработаны еще до появления стандарта ANSI
Кроме того ,"in" и "not in" легче читаются и соответственно легче понимаются
Если в запросе используются константные выражения (как в примере Саныча)
то использование "in" предпочтительнее, так как на производительность это не влияет, а запрос получается короче и читабельнее. Если же в "in"/"not in" используется подзапрос , то тогда действительно использовать JOINы гораздо лучше ( с точки зрения производительности)
...
Рейтинг: 0 / 0
Составить запросик...
    #32440734
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПро "exist" не скажу - с ходу не придумаю, а вот зачем нужны "in" и "not in"?
Кроме того как "для облегчения понимания текста запроса"?
Я не могу придумать запрос, в котором эти операторы нельзя было бы заменить на один из join ... where. И выполняться последние будут в худшем случае не медленнее
вот даже читать такое удивительно - Вы, батенька, так людей заиками переделаете ;)

exists (not exists), In (not in) - операторы работы с МНОЖЕСТВАМИ, которые могут быть двух типов: фиксированный набор значений (бессмысленно для exists) или множество, получаемое путем выборки. (см вариант от (c)VIG
авторselect a.Artikul
from tblModelsInArtikul t inner join tblArtikul a
on t.Id_Artikul =a.Id_Artikul
where t.ModelInArt='N040'
and exists
(select * from tblModelsInArtikul t2 where t2.Id_Artikul =t.Id_Artikul and t2.ModelInArt='P001')

который через In переписывается так (не единственным способом):

select a.Artikul
from tblModelsInArtikul t inner join tblArtikul a
on t.Id_Artikul =a.Id_Artikul
where t.ModelInArt='N040'
and t.Id_Artikul IN
(select t2.Id_Artikul from tblModelsInArtikul t2 where t2.ModelInArt='P001')

По факту исходый вариант будет работать быстрее, НЕ ТОЛЬКО потому, что налагает более жесткое условие на выбор из t2, но и потому, что проверка на СУЩЕСТВОВАНИЕ множества (достаточно убедиться, что записей >0) (почти) всегда быстрее проверки на попадание в множество (перебор значений). Когда разработчикам удается сделать IN по времени выполнения не хуже exists для каких-то конкретных ситуаций - они пишут об этом самыми крупными красными буквами на заглавных страницах своих сайтов.

по времени выполнения варианты от (c)VIG и GEO (кажется абсолютно) эквивалентны, при этом вариант GEO, может быть переписан совсем без where примерно так:
select a.*
from
(tblArtikul as a inner join tblModelsInArtikul as b on a.id_Artikul=b.id_Artikul AND b.ModelInArt="N040")
inner join tblModelsInArtikul as c on a.id_Artikul=c.id_Artikul and c.ModelInArt="P001"

вариант от Владимир Саныч выглядит как несколько отличающийся по плану исполнения, поскольку один поиск по индексу заменен на группировку с последующим отбором значений по счетчику. На небольших множествах поиска и сравнения, кажется он будет самым быстрым.


Это же ОПЕРАТОРЫ, и In и exists и = и AND ...
Ваше право их применять при формулировке условия отбора - внутри where
или как часть выражения Join ограничивается только умениями конкретного планировщика запросов, а не логикой языка.
Например, до версии 2000 Access как помнится, совсем не умел работать с выводимыми таблицами в выражении From, да и сейчас (2000-2002) его умения в это части сильно ограничены. В то же время он вполне прилично справляется с выражением Where.

а моя мысль после пардонса пошла совсем по ложному пути.
В этом прелесть того, что настоящим языком является - одно и то-же многими способами сказать возможно, и в каждом выражении - своя поэзия. Более того - слово структуру мысли задает - назвал яхту бедой - и не получил рабочего запроса.
-)
вот кажется суббота подобралась и холодильник опять пустой...
...
Рейтинг: 0 / 0
Составить запросик...
    #32440735
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЕсли же в "in"/"not in" используется подзапрос , то тогда действительно использовать JOINы гораздо лучше ( с точки зрения производительности)
-)
а вот с этим я не согласен, не взирая на пустоту холодильника.
ладно, пошел затариваться - не знаю вернусь ли -)
...
Рейтинг: 0 / 0
Составить запросик...
    #32440737
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторвот даже читать такое удивительно - Вы, батенька, так людей заиками переделаете ;)
Дык, я ж и не претендую на звание доктора :)
Я ж сам тут подлечиваюсь в основном.
авторexists (not exists), In (not in) - операторы работы с МНОЖЕСТВАМИ
А join с чем? :)
В принципе, вы ответили на заданный вопрос.
Так я его продолжу.
А приведите как-нибудь опосля пятницы/субботы, кому не сложно, "запрос с exist", который нельзя было бы без потери производительности или "сложности" переделать в "запрос с join".
Я сам exists никогда не пользовался, и зело интересно, зачем он вообще нужен.
Заранее спасибо. :)
...
Рейтинг: 0 / 0
Составить запросик...
    #32441358
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо народ поднакидали...
не ожидал вызвать такой резонанс...
ещё раз спасибо...

теперь по поводу...

2 (c)VIG & Geo
прикольно... но есть трабла... запросик должон делаться динамически, и кол-во моделей может варьироваться от 1..~5... и насколько я понял с каждой добавочной моделью запросик будет прилично распухать...
+ как выяснилось иногда нужон LIKE т.к. вполне могут написать P* и надо будет найти...

ввиду плюсика IN ВС'а не подойдёт...):

записей в табличке tblArtikul планируется порядка 3000-5000 в tblModelsInArtikul ~ в два раза больше.

PS. Это не единственное допустимое условие на выборку в данном запросе... все остальные на Like и только по tblArtikul.

Сделать можно всё!!!
Только бы знать как...
...
Рейтинг: 0 / 0
Составить запросик...
    #32442217
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторс каждой добавочной моделью запросик будет прилично распухать...
Да и пусть себе пухнет. Жалко что ли?

С другой стороны, можно завести отдельную таблицу, складывать в нее условия, отбирать все модели артикулы

select distinct tblModelsInArtikul.id_articul, tblModelsInArtikul.modelInArt from tblModelsInArtikul right join TempTable on tblModelsInArtikul.modelInArt like tempTable.strField;

примерно так. А из полученного набора выбирать группировко артикулы, с которыми есть n записей, где n - количество условий отбора.
...
Рейтинг: 0 / 0
Составить запросик...
    #32442262
Sfagnum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GeoДа и пусть себе пухнет. Жалко что ли? Не жалко... а как скорость...вариант саныча не быстрее ли будет?

Сделать можно всё!!!
Только бы знать как...
...
Рейтинг: 0 / 0
Составить запросик...
    #32442280
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> вариант саныча не быстрее ли будет?

А попробовать? (Я то-откуда знаю? ;)

Виктоша говорит, что в маленьких таблицах вариант ВС будет быстрее. Про большие молчит.

----

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


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