|
Помогите с составлением запроса
|
|||
---|---|---|---|
#18+
Вобщем не могу составить запрос. Есть три таблицы: 1) Таблица Docs Id_Doc - ключ Name_Doc - имя документа 2) Таблица Words Id_Word - ключ Name_Word - слово 3) Таблица Words2Docs Id_Word - составной ключ Id_Doc - составной ключ Таблицы Docs и Words связаны между собой посредством Words2Docs. Например, нужно выбрать из Docs все документы где встречаются слова 'налог' _И_ 'ставка'. Когда одно слово тут все понятно - LIKE '%налог%', а вот как быть с несколькими? Помогите советом плиз. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2003, 12:39 |
|
Помогите с составлением запроса
|
|||
---|---|---|---|
#18+
select * from Docs where Id_Doc in ( select Id_Doc from Words2Docs where Id_Word in ( select Id_Word from Words where Name_Word like '%jopa% or Name_Word like '%popa%' ) ) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2003, 14:21 |
|
Помогите с составлением запроса
|
|||
---|---|---|---|
#18+
Огромное человеческое спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2003, 16:38 |
|
Помогите с составлением запроса
|
|||
---|---|---|---|
#18+
2 ReAlex: Вы уверены, что надо искать LIKE '%налог%', а, например, не = 'налог'? В этом случае при поиске использовался бы индекс... Стройте нужные индексы, выбирайте, какой запрос будет быстрее... select distinct Id_Doc, Name_Doc from Words join Words2Docs using(Id_Word) join Docs using(Id_Doc) where Name_Word like '%jopa%' or Name_Word like '%popa%'; select Id_Doc, Name_Doc from Words join Words2Docs using(Id_Word) join Docs using(Id_Doc) where Name_Word like '%jopa%' union select Id_Doc, Name_Doc from Words join Words2Docs using(Id_Word) join Docs using(Id_Doc) where Name_Word like '%popa%'; select * from Docs where exists ( select 1 from Words2Docs where Id_Doc=Docs.Id_Doc and exists ( select 1 from Words where Id_Word=Words2Docs.Id_Word and ( Name_Word like '%jopa%' or Name_Word like '%popa%' ) ) ); 2 wbear: Вы смотрели explain вашего запроса? Недавно сам натолкнулся на грабли постгресового IN-а. Как написано в доке: it's unwise to assume that the subquery will be evaluated completely. :-( Эффективнее такой запрос: select * from Docs where Id_Doc in ( select Id_Doc from Words2Docs where Id_Doc=Docs.Id_Doc and Id_Word in ( select Id_Word from Words where Id_Word=Words2Docs.Id_Word and ( Name_Word like '%jopa%' or Name_Word like '%popa%' ) ) ); Более читабелен идентичный: select * from Docs where exists ( select 1 from Words2Docs where Id_Doc=Docs.Id_Doc and exists ( select 1 from Words where Id_Word=Words2Docs.Id_Word and ( Name_Word like '%jopa%' or Name_Word like '%popa%' ) ) ); ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2003, 14:30 |
|
Помогите с составлением запроса
|
|||
---|---|---|---|
#18+
я конечно гад что новичку подсовываю запрос которы можно более оптимально написать... но чтож поделаеш... можно было конечто развить тему и написать ему что мол нужна вакуум делать чаще, подумать что мол следует еше seq_scan вырубить, шаред памяти выкрутить и т.д... тока у меня создалось впечатление что человек еще SQL плохо знает и емуб сначало научится простому а уж потом оптимизироватся...зачем лишний раз бошку ему засорять...да и лень мне было.. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2003, 15:49 |
|
|
start [/forum/topic.php?fid=53&msg=32167906&tid=2008195]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
2ms |
others: | 276ms |
total: | 409ms |
0 / 0 |