Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Вложенный запрос / 25 сообщений из 25, страница 1 из 1
11.11.2004, 16:17:40
    #32777917
Patriot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
Я пробую использовать следующий запрос :

Код: plaintext
1.
2.
3.
4.
5.
select WordsFirms.keyword from WordsFirms
where WordsFirms.keyword =
 (Select WordForms.wf_value from WordForms
WHERE WordForms.W_ID = ( SELECT WordForms.W_ID FROM WordForms
 WHERE WordForms.wf_value= 'банки') )

но выдается ошибка
Код: plaintext
Данный подчиненный запрос должен содержать не более одной записи 

если вызывать отдельно :
Код: plaintext
1.
2.
(Select WordForms.wf_value from WordForms
WHERE WordForms.W_ID = ( SELECT WordForms.W_ID FROM WordForms
 WHERE WordForms.wf_value= 'банки') )

выдается все работает выдается несколько значений ... может быть есть какие-то ограничения на глубину вложенности запросов ???

Заранее благодарен
...
Рейтинг: 0 / 0
11.11.2004, 16:28:13
    #32777952
Shurgenz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
select WordsFirms.keyword from WordsFirms
where WordsFirms.keyword =
(Select WordForms.wf_value from WordForms
WHERE WordForms.W_ID in ( SELECT WordForms.W_ID FROM WordForms
WHERE WordForms.wf_value= 'банки') )
...
Рейтинг: 0 / 0
12.11.2004, 14:52:24
    #32779856
Patriot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
Спасибо переписал запрос :

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT f_id,predpr_uslugi from FIRMS
WHERE f_id IN
(select WordsFirms.f_id from WordsFirms
where WordsFirms.keyword IN
 (Select WordForms.wf_value from WordForms
WHERE WordForms.W_ID IN ( SELECT WordForms.W_ID FROM WordForms
 WHERE WordForms.wf_value IN
 (
 'банки'
 )) )
OR WordsFirms.keyword IN (
'банки'
))

Запрос почему-то зависает :(
Хотя если поставвить вместо :

Код: plaintext
1.
WHERE WordForms.W_ID IN ( SELECT WordForms.W_ID FROM WordForms

Код: plaintext
1.
WHERE WordForms.W_ID = ( SELECT WordForms.W_ID FROM WordForms
То работает ... но естественно только тогда когда вложенный запрос возвращает одно значение...
...
Рейтинг: 0 / 0
12.11.2004, 14:55:59
    #32779872
Shurgenz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
а тот запрос, что я написал тоже зависает?
...
Рейтинг: 0 / 0
12.11.2004, 15:04:43
    #32779910
Patriot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
Нет не зависает ... но он выдает лишь часть необходимой информации ... Которую необходимо использовать для последующей выборки :(
...
Рейтинг: 0 / 0
12.11.2004, 15:16:37
    #32779965
Shurgenz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT f_id,predpr_uslugi from FIRMS
WHERE f_id IN
(select WordsFirms.f_id from WordsFirms
where WordsFirms.keyword IN
 (Select WordForms.wf_value from WordForms
WHERE WordForms.W_ID IN ( SELECT WordForms.W_ID FROM WordForms
 WHERE WordForms.wf_value = 'банки' OR WordsFirms.keyword ='банки')))

А такое не годится?
...
Рейтинг: 0 / 0
12.11.2004, 15:49:49
    #32780079
Patriot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
Неа виснет наглухо хотя в базе записей - то кот наплакал :(
...
Рейтинг: 0 / 0
12.11.2004, 15:55:31
    #32780098
Shurgenz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
кхм... структуру таблиц и то что требуется... а то так не врубаюсь
...
Рейтинг: 0 / 0
12.11.2004, 16:09:36
    #32780161
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
так не поможет?

SELECT f_id,predpr_uslugi
FROM (WordForms INNER JOIN WordsFirms ON WordForms.wf_value=WordsFirms.keyword)
INNER JOIN FIRMS ON WordsFirms.f_id=FIRMS.f_id
WHERE
WordForms.wf_value='банки'
...
Рейтинг: 0 / 0
12.11.2004, 16:30:11
    #32780226
Patriot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
Victosha нет не то ...
Да действительно это моя ошибка что сразу не поставил четко задачу и не рассказал о структуре :
Структура таблиц следующая :
WordsForms :таблица слов и словоформ ...
где w_id-ссылка на слово к которому подбираются словоформы ,а wf_value сами словоформы
WordsFirms :таблица связи слов и Id_Предприятия
Сразу же оговорюсь база сделана так (в виду некоторых обстоятельств )
что keyword могут не содержаться в WordsForms.wf_value поэтому и наоборот может содержаться одна из слофоформ слова в запросе.
Таким образом нужна следующая последовательность действий :
1)определяем группу все словоформы заданных в запросе слов :
Код: plaintext
1.
2.
3.
Select WordForms.wf_value from WordForms
WHERE WordForms.W_ID IN ( SELECT WordForms.W_ID FROM WordForms
WHERE WordForms.wf_value IN ( 'мясо,банки' )) 
2)опредляем чсписок предприятий у которых в ключевых словах имеются слова из найденой группы
3)Но т.к. в группе слов и словоформ могут и не быть слова поиска ... то необходимо еще проверить возможно эти слова поиска входят в ключевые
WordsFirms.keywords ...вот такая проблема ...
...
Рейтинг: 0 / 0
12.11.2004, 16:36:00
    #32780242
Shurgenz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
Сорри, если будет время, на выходных гляну и подумаю... бежать пора
...
Рейтинг: 0 / 0
12.11.2004, 22:55:51
    #32780696
Shurgenz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
с трудом, вообще врубился, если врубился, в чем я сильно сомневаюсь


Код: plaintext
1.
2.
3.
4.
SELECT a.f_id,predpr_uslugi from FIRMS as a
inner join WordsFirms as b on a.f_id=b.f_id 
where WordsFirms.keyword IN ('банки','склянки')
or WordsFirms.keyword IN
 (Select WordForms.w_id from WordForms where wf_value in ('банки', 'склянки'))
...
Рейтинг: 0 / 0
17.11.2004, 13:11:40
    #32786546
Patriot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
ССорри отьезжал в командировку ... Shurgenz , пробую разобраться в твоем SELECTe ... выглядит очень серьезно ;)
в общем-то перед командировкой я добился работы следующей выборки :

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SELECT * from FIRMS
WHERE f_id IN
(select WordsFirms.f_id from WordsFirms
where WordsFirms.keyword IN
 (Select WordForms.wf_value from WordForms
WHERE WordForms.W_ID IN ( SELECT WordForms.W_ID FROM WordForms
WHERE WordForms.wf_value IN
(
'знакомства'
)) )
)
UNION
SELECT * from FIRMS
WHERE f_id IN
(select WordsFirms.f_id from WordsFirms
where WordsFirms.keyword IN(
'банк'
))
смысл всего слудующего по :
По заданным по поиску словам определяю их словоформы если они есть и заодно по самим словам делаю поиск , результаты обьединяю ...
Дак вот если вместо обьединения результатов вставить просто дополнительную проверку OR как видно это вполне реально то запрос виснет ... а данный запрос работает только с 8-м сервис паком MicrosoftJet Provider ///
СТранно !)
...
Рейтинг: 0 / 0
17.11.2004, 13:40:40
    #32786639
Patriot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
Shurgenz Протестировал твой запрос ... да действительно ты правильно понял задачу ... единственное необходимо модифицировать запрос до :

Код: plaintext
1.
2.
3.
4.
5.
SELECT a.f_id,predpr_uslugi from FIRMS as a
inner join WordsFirms as b on a.f_id=b.f_id
where WordsFirms.keyword IN ('банки','склянки')
or WordsFirms.keyword IN
(SELECT WordForms.wf_value FROM WordForms WHERE WordForms.w_id  IN
(Select WordForms.w_id from WordForms where wf_value in ('банки', 'склянки')))

И тут-то и начинается зависание ... я примерно до такого же запроса дошел ... но ... попробовал разбить условия и сделать обьединение ... вроде не виснет ... но тут как я уже сказал проблема во вложенном запросе не должно было быть обьединений ... необходимо АПДЕЙТ Microsof JET OLE DB Provider делать ...
В общем странно почему так происхоидт :(
...
Рейтинг: 0 / 0
17.11.2004, 14:57:30
    #32786971
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
1. попробуй подчиненные запросы в In(SELECT ... ) переписать на EXISTS(SELECT * FROM WordForms AS sub ) перенеся WordsFirms.keyword = sub.W_ID в WHERE подзапроса (и тот и другой подзапрос выполняется аксессом для каждой записи внешнего запроса, но SELECT в EXISTS обязан только найти первую попавшуюся, а SELECT в In - вернуть все записи.



2. Попробуй взять SELECT в IN в квадратные скобки [ ].
Примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT таблица.контрагент, таблица.*
FROM таблица
WHERE (таблица.контрагент) In (
SELECT * FROM
 [SELECT таблица.контрагент
FROM таблица
WHERE (таблица.код= 2 )]. AS q
);
не уверен, но допускаю, что набор записей в [ ]. вычисляется Джетом один раз до входа в первую запись. Даст ли это что-нть - черт его знает. (скорей всего не даст).



3. Не стоит совсем отмахиваться от JOIN:
Пример (Акс 97):
Код: plaintext
1.
2.
3.
4.
SELECT  A.*
FROM таблица A  INNER JOIN
 [SELECT DISTINCT контрагент FROM  таблица WHERE код= 2 ]. AS B
ON (A.контрагент = B.контрагент OR  A.код IN ( 2 , 3 , 4 ))
;
(только тут набор записей необновляем, в отличии от 1.,2.
...
Рейтинг: 0 / 0
17.11.2004, 15:08:37
    #32787014
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
Пример для 1.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT A.*
FROM таблица A
WHERE
   EXISTS(SELECT *
      FROM таблица B
      WHERE B.код  IN( 2 , 3 , 4 , 5 )
      AND B.контрагент = A.контрагент)
   OR 
   A.код IN( 2 , 3 , 4 , 5 )
;
...
Рейтинг: 0 / 0
17.11.2004, 15:32:26
    #32787117
Patriot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
Спасибо , уже пробую ;)
...
Рейтинг: 0 / 0
18.11.2004, 13:25:20
    #32789057
Patriot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
Протестировал следующий запрос :

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT *
FROM FIRMS
WHERE
   EXISTS(SELECT f_id
      FROM WordsFirms
      WHERE WordsFirms.keyword IN
      (
      SELECT WordForms.wf_value FROM WordForms WHERE
      WordForms.w_id  IN
      (Select WordForms.w_id from WordForms where wf_value in ('банки', 'склянки'))
      )
      AND FIRMS.f_id = WordsFirms.f_id)
Работает на УРА !
Но необходима работа следующего запроса :


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT *
FROM FIRMS
WHERE
   EXISTS(SELECT f_id
      FROM WordsFirms
      WHERE WordsFirms.keyword IN
      (
      SELECT WordForms.wf_value FROM WordForms WHERE
      WordForms.w_id  IN
      (Select WordForms.w_id from WordForms where wf_value in ('банки', 'склянки'))
       )
     AND WordsFirms.f_id=FIRMS.f_id 
     OR WordsFirms.keyword IN ('банки', 'склянки') 
)

А он то как раз и виснет из-за добавленного условия
Код: plaintext
 OR WordsFirms.keyword IN ('банки', 'склянки') 
в подзапросе :(
...
Рейтинг: 0 / 0
18.11.2004, 14:23:34
    #32789239
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
че-то там не так
1) AND WordsFirms.f_id=FIRMS.f_id должно делаться на все в EXISTS, т.е. быть за скобками на (... OR ...) а у Вас напротив, OR распространяется на все
2). Усли уходите от IN(SELECT ...) в главном запросе, что мешает уйти от них и в подчиненных (всех уровней).
3). Ваша логика построения запроса такова, будто бы сначала выполняется самый вложенный, а затем включающий его? На самом деле это не так. Для каждой записи основного запроса выполняются вложенные (и далее - внутрь). Т.ч. если есть возможность снизить уровень вложенности - сделайте это. Поскольку я не знаю вашей задачи, не могу и проанализировать логическое соответствие структуры запроса - задаче и снизить уровень вложенности, т.ч. попробую отойти от "культурных наслоений" и взяв первый ваш запрос, формально выполнить редактирование,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
select W.keyword from WordsFirms W
WHERE EXISTS
  (Select * from WordForms W1
    WHERE EXISTS
           ( SELECT * FROM WordForms W2
           WHERE W2.wf_value= 'банки'
                AND  W1.W_ID = W2.W_ID)
  AND W.keyword =W1.wf_value )
;
-тут явно видно, что второй вложенный запрос может быть сыршенно логически излишен. Если W_ID - уникально (ключ WordForms) (Т.к. тогда W1.W_ID = W2.W_ID, то запись одна и та же. Т.е. W1==W2, и условия достаточно перетащить из второго вложенного наружу - в первый).
Если же это не так (т.е. если существуют записи W1.W_ID = W2.W_ID AND W2.wf_value= 'банки' AND W1.wf_value<> 'банки') то все равно вложенные запросы вряд ли стоит строить так многоступенчато, как вы пишете. В этом случае достаточно:

* FROM WordForms AS W1 INNER JOIN WordForms AS W2 ON (W1.W_ID = W2.W_ID AND W2.wf_value= 'банки') WHERE W.keyword =W1.wf_value

ибо от вложенных в EXISTS запросов обновляемости и не требуется.
...
Рейтинг: 0 / 0
18.11.2004, 16:01:51
    #32789533
Patriot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
Написал вот такой запрос может поспешил .. не пойму почему возвращает повторные записи ... это наверное сказывается конец рабочего дня ...
Все работает СУПЕР !!!

Код: plaintext
1.
2.
3.
4.
5.
select DISTINCT W.f_id from WordsFirms W
WHERE EXISTS
  (SELECT W1.wf_value FROM WordForms AS W1,WordForms AS W2
            WHERE    W1.W_ID = W2.W_ID AND W2.wf_value= 'банки'
  AND W.keyword =W1.wf_value )
ORDER BY  1 

Но опять таки куда вставить доп.условие :
Код: plaintext
 OR WordsFirms.keyword IN ('банки', 'склянки') 

И еще вопрос есть ли в АКЦЕССЕ такое понятие как UDF и если есть можно ли писать так :
ORDER BY UDF (...) а во внутрь передавать Мемо поле ?
...
Рейтинг: 0 / 0
18.11.2004, 18:31:22
    #32790029
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
Patriot
Код: plaintext
1.
2.
3.
4.
5.
select DISTINCT W.f_id from WordsFirms W
WHERE EXISTS
  (SELECT W1.wf_value FROM WordForms AS W1,WordForms AS W2
            WHERE    W1.W_ID = W2.W_ID AND W2.wf_value= 'банки'
  AND W.keyword =W1.wf_value )
ORDER BY  1 

Но опять таки куда вставить доп.условие :
Код: plaintext
 OR WordsFirms.keyword IN ('банки', 'склянки') 

И еще вопрос есть ли в АКЦЕССЕ такое понятие как UDF и если есть можно ли писать так :
ORDER BY UDF (...) а во внутрь передавать Мемо поле ?

это што ли надо?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select DISTINCT W.f_id from WordsFirms W
WHERE W.keyword IN ('банки', 'склянки') 
 OR EXISTS
  (SELECT W1.wf_value FROM WordForms AS W1,WordForms AS W2
            WHERE W1.W_ID = W2.W_ID AND W2.wf_value= 'банки'                     
              AND W.keyword =W1.wf_value )
;

В кач-ве UDF - VBA ф-ии. Скажем MyFun(fMEMO)
тады как-то так:
SELECT * , MyFun(fMEMO) as Ord
FROM MyTable
ORDER BY MyFun(fMEMO);

по моему начиная с некоего SP на jet можно даже ORDER BY [fMEMO]. Поищи на форуме (в том топике было кажется {ORDER BY + MEMO + SP + JET4.0 + GROUP BY + DISTINCT} )
...
Рейтинг: 0 / 0
19.11.2004, 12:18:27
    #32790978
Patriot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
Я единственного не пойму почему этот самый запрос :
Код: plaintext
1.
2.
3.
4.
5.
select DISTINCT W.f_id from WordsFirms W
WHERE  EXISTS
  (SELECT W1.wf_value FROM WordForms AS W1,WordForms AS W2
            WHERE W1.W_ID = W2.W_ID AND W2.wf_value= 'банки'                    
     AND W.keyword =W1.wf_value )

выполняется мгновенно а вот этот :
Код: plaintext
1.
2.
3.
4.
5.
6.
select DISTINCT W.f_id from WordsFirms W
WHERE W.keyword IN ('банки', 'склянки')
 OR EXISTS
  (SELECT W1.wf_value FROM WordForms AS W1,WordForms AS W2
            WHERE W1.W_ID = W2.W_ID AND W2.wf_value= 'банки'                    
     AND W.keyword =W1.wf_value )

Почти больше и это при том что количество записей в базе не больше 3000 в каждой из используемых таблиц ...

Заранее Спасибо за участие запрос действительно преобразился 4321 , большое спасибо за помощь !!!!
...
Рейтинг: 0 / 0
19.11.2004, 12:19:31
    #32790984
Patriot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
Не договорил ... второй запорос выпоняется более минуты :(
...
Рейтинг: 0 / 0
19.11.2004, 12:26:09
    #32791012
Patriot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
И что самое поразительное опять-таки следующий запрос выполняется мгновенно ...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
select DISTINCT W.f_id from WordsFirms W
WHERE EXISTS
  (SELECT W1.wf_value FROM WordForms AS W1,WordForms AS W2
            WHERE W1.W_ID = W2.W_ID AND W2.wf_value= 'банки'
     AND W.keyword =W1.wf_value )
UNION
select DISTINCT f_id from WordsFirms
WHERE
keyword IN ('банки','...')

Не пойму , что в этом не так ??? :

Код: plaintext
1.
2.
3.
4.
5.
6.
select DISTINCT W.f_id from WordsFirms W
WHERE W.keyword IN ('банки', 'склянки')
 OR EXISTS
  (SELECT W1.wf_value FROM WordForms AS W1,WordForms AS W2
            WHERE W1.W_ID = W2.W_ID AND W2.wf_value= 'банки'                   
     AND W.keyword =W1.wf_value )
...
Рейтинг: 0 / 0
19.11.2004, 13:49:24
    #32791338
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
Запусти лог анализа запросов (ищи по форуму -запускается после редактирования регистри).

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


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