|
|
|
Составить запросик...
|
|||
|---|---|---|---|
|
#18+
есть две таблички... tblArtikul и tblModelsInArtikul (1--8) с данными: tblArtikul: Код: plaintext 1. 2. Код: plaintext 1. 2. 3. 4. Надо как сделать кокое-нить условие шоб показал все артикула где присутсвуют 2 модели N040 и P001, но только те где присутсвуют обе модели, т.е. в данном случае артикул K001N040T1 на кол-во моделей не хотелось бы завязываться Сделать можно всё!!! Только бы знать как... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2004, 17:18 |
|
||
|
Составить запросик...
|
|||
|---|---|---|---|
|
#18+
...where count(*)=2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2004, 17:23 |
|
||
|
Составить запросик...
|
|||
|---|---|---|---|
|
#18+
А точнее: 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)); То, что выделено красным, надо менять динамически. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2004, 17:36 |
|
||
|
Составить запросик...
|
|||
|---|---|---|---|
|
#18+
объявляю себе пятницу не проверяя, что в календаре SELECT DISTINCT tblArtikul.Artikul FROM tblArtikul RIGHT JOIN tblModelsInArtikul ON (tblArtikul.ID_Artikul=tblModelsInArtikul.Id_Artikul AND (tblModelsInArtikul.ModelInArt="N040" OR tblModelsInArtikul.ModelInArt="P001")) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2004, 17:39 |
|
||
|
Составить запросик...
|
|||
|---|---|---|---|
|
#18+
лажанулся малость - действительно, сказано надо обе ПАРДОНС ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2004, 17:42 |
|
||
|
Составить запросик...
|
|||
|---|---|---|---|
|
#18+
2 ВС надеялся что можно как нить по другому без Count... абыдна... а что лучше (((tblModelsInArtikul.ModelInArt) In ('N040','P001'))) или tblModelsInArtikul.ModelInArt='N040' AND tblModelsInArtikul.ModelInArt='P001'? Сделать можно всё!!! Только бы знать как... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2004, 09:10 |
|
||
|
Составить запросик...
|
|||
|---|---|---|---|
|
#18+
как всегда напутал... читай tblModelsInArtikul.ModelInArt='N040' OR tblModelsInArtikul.ModelInArt='P001'? Сделать можно всё!!! Только бы знать как... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2004, 09:45 |
|
||
|
Составить запросик...
|
|||
|---|---|---|---|
|
#18+
Если генерить этот селект автоматом, то in проще. :^) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2004, 20:06 |
|
||
|
Составить запросик...
|
|||
|---|---|---|---|
|
#18+
Хотели решение как нить по другому без Count.. - их есть у меня :) Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2004, 20:57 |
|
||
|
Составить запросик...
|
|||
|---|---|---|---|
|
#18+
VIG, тебе полагается звание Виртуоз SQL'я. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2004, 21:03 |
|
||
|
Составить запросик...
|
|||
|---|---|---|---|
|
#18+
Ага, с добавлением - "плохознающий Access" Саныч, настоящие виртуозы SQL здесь , а я так ,"еще только учусь..." ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2004, 21:23 |
|
||
|
Составить запросик...
|
|||
|---|---|---|---|
|
#18+
При чем тут Аксесс? Ты на одном SQL'е можешь сваять что угодно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2004, 21:27 |
|
||
|
Составить запросик...
|
|||
|---|---|---|---|
|
#18+
При чем тут Аксесс? Действительно, о чем это я ? ( из какого-то КВНа) Спасибо, Саныч ! Твои бы слова да моему работодателю в уши ... З.Ы А твоя фирма мне так и не ответила. Ей (фирме ) очевидно нужны только виртуозы Аксесса . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2004, 22:50 |
|
||
|
Составить запросик...
|
|||
|---|---|---|---|
|
#18+
Моя фирма не ответила еще 10 или 20 человекам, CV которых я приносил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2004, 22:52 |
|
||
|
Составить запросик...
|
|||
|---|---|---|---|
|
#18+
А почему не так: Код: plaintext 1. 2. 3. 4. ? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2004, 23:49 |
|
||
|
Составить запросик...
|
|||
|---|---|---|---|
|
#18+
2 Geo "И ты то же прав" ( из старого еврейского анекдота) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2004, 00:23 |
|
||
|
Составить запросик...
|
|||
|---|---|---|---|
|
#18+
А вот тогда и я спрошу. Про "exist" не скажу - с ходу не придумаю, а вот зачем нужны "in" и "not in"? Кроме того как "для облегчения понимания текста запроса"? Я не могу придумать запрос, в котором эти операторы нельзя было бы заменить на один из join ... where. И выполняться последние будут в худшем случае не медленнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2004, 00:39 |
|
||
|
Составить запросик...
|
|||
|---|---|---|---|
|
#18+
а вот зачем нужны "in" и "not in"? Вопрос скорее к разработчикам стандарта Точно так же можно спросить зачем нужен Between, когда прекрасно можно обойтись >= and <= Имхо, это сделано для совместимости с различными системами которые , были разработаны еще до появления стандарта ANSI Кроме того ,"in" и "not in" легче читаются и соответственно легче понимаются Если в запросе используются константные выражения (как в примере Саныча) то использование "in" предпочтительнее, так как на производительность это не влияет, а запрос получается короче и читабельнее. Если же в "in"/"not in" используется подзапрос , то тогда действительно использовать JOINы гораздо лучше ( с точки зрения производительности) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2004, 01:10 |
|
||
|
Составить запросик...
|
|||
|---|---|---|---|
|
#18+
авторПро "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. а моя мысль после пардонса пошла совсем по ложному пути. В этом прелесть того, что настоящим языком является - одно и то-же многими способами сказать возможно, и в каждом выражении - своя поэзия. Более того - слово структуру мысли задает - назвал яхту бедой - и не получил рабочего запроса. -) вот кажется суббота подобралась и холодильник опять пустой... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2004, 02:36 |
|
||
|
Составить запросик...
|
|||
|---|---|---|---|
|
#18+
авторЕсли же в "in"/"not in" используется подзапрос , то тогда действительно использовать JOINы гораздо лучше ( с точки зрения производительности) -) а вот с этим я не согласен, не взирая на пустоту холодильника. ладно, пошел затариваться - не знаю вернусь ли -) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2004, 02:39 |
|
||
|
Составить запросик...
|
|||
|---|---|---|---|
|
#18+
авторвот даже читать такое удивительно - Вы, батенька, так людей заиками переделаете ;) Дык, я ж и не претендую на звание доктора :) Я ж сам тут подлечиваюсь в основном. авторexists (not exists), In (not in) - операторы работы с МНОЖЕСТВАМИ А join с чем? :) В принципе, вы ответили на заданный вопрос. Так я его продолжу. А приведите как-нибудь опосля пятницы/субботы, кому не сложно, "запрос с exist", который нельзя было бы без потери производительности или "сложности" переделать в "запрос с join". Я сам exists никогда не пользовался, и зело интересно, зачем он вообще нужен. Заранее спасибо. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2004, 02:52 |
|
||
|
Составить запросик...
|
|||
|---|---|---|---|
|
#18+
спасибо народ поднакидали... не ожидал вызвать такой резонанс... ещё раз спасибо... теперь по поводу... 2 (c)VIG & Geo прикольно... но есть трабла... запросик должон делаться динамически, и кол-во моделей может варьироваться от 1..~5... и насколько я понял с каждой добавочной моделью запросик будет прилично распухать... + как выяснилось иногда нужон LIKE т.к. вполне могут написать P* и надо будет найти... ввиду плюсика IN ВС'а не подойдёт...): записей в табличке tblArtikul планируется порядка 3000-5000 в tblModelsInArtikul ~ в два раза больше. PS. Это не единственное допустимое условие на выборку в данном запросе... все остальные на Like и только по tblArtikul. Сделать можно всё!!! Только бы знать как... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2004, 09:44 |
|
||
|
Составить запросик...
|
|||
|---|---|---|---|
|
#18+
авторс каждой добавочной моделью запросик будет прилично распухать... Да и пусть себе пухнет. Жалко что ли? С другой стороны, можно завести отдельную таблицу, складывать в нее условия, отбирать все модели артикулы select distinct tblModelsInArtikul.id_articul, tblModelsInArtikul.modelInArt from tblModelsInArtikul right join TempTable on tblModelsInArtikul.modelInArt like tempTable.strField; примерно так. А из полученного набора выбирать группировко артикулы, с которыми есть n записей, где n - количество условий отбора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2004, 16:36 |
|
||
|
Составить запросик...
|
|||
|---|---|---|---|
|
#18+
GeoДа и пусть себе пухнет. Жалко что ли? Не жалко... а как скорость...вариант саныча не быстрее ли будет? Сделать можно всё!!! Только бы знать как... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2004, 16:57 |
|
||
|
Составить запросик...
|
|||
|---|---|---|---|
|
#18+
> вариант саныча не быстрее ли будет? А попробовать? (Я то-откуда знаю? ;) Виктоша говорит, что в маленьких таблицах вариант ВС будет быстрее. Про большие молчит. ---- ЗЫ. С получением зарплаты жизнь как-то налаживается. Пивка штоль купить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2004, 17:05 |
|
||
|
|

start [/forum/topic.php?fid=45&fpage=1667&tid=1676078]: |
0ms |
get settings: |
8ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
303ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
77ms |
get tp. blocked users: |
2ms |
| others: | 220ms |
| total: | 649ms |

| 0 / 0 |
