powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите с составлением запроса
6 сообщений из 6, страница 1 из 1
Помогите с составлением запроса
    #32163872
ReAlex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вобщем не могу составить запрос.

Есть три таблицы:
1) Таблица Docs
Id_Doc - ключ
Name_Doc - имя документа

2) Таблица Words
Id_Word - ключ
Name_Word - слово

3) Таблица Words2Docs
Id_Word - составной ключ
Id_Doc - составной ключ


Таблицы Docs и Words связаны между собой посредством Words2Docs.

Например, нужно выбрать из Docs все документы где встречаются слова 'налог' _И_ 'ставка'.
Когда одно слово тут все понятно - LIKE '%налог%', а вот как быть с несколькими?


Помогите советом плиз.
...
Рейтинг: 0 / 0
Помогите с составлением запроса
    #32164051
wbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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%'

)

)
...
Рейтинг: 0 / 0
Помогите с составлением запроса
    #32164245
ReAlex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Огромное человеческое спасибо!
...
Рейтинг: 0 / 0
Помогите с составлением запроса
    #32165132
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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%' )
)
);
...
Рейтинг: 0 / 0
Помогите с составлением запроса
    #32167906
wbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я конечно гад что новичку подсовываю запрос которы можно более оптимально написать... но чтож поделаеш...
можно было конечто развить тему и написать ему что мол нужна вакуум делать чаще, подумать что мол следует еше seq_scan вырубить, шаред памяти выкрутить и т.д... тока у меня создалось впечатление что человек еще SQL плохо знает и емуб сначало научится простому а уж потом оптимизироватся...зачем лишний раз бошку ему засорять...да и лень мне было.. :)
...
Рейтинг: 0 / 0
Помогите с составлением запроса
    #32167994
ReAlex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, на самом деле данных в табличке немного, всего пару сотен.
Поэтому скорость не столь важна....
А искать нужно именно LIKE '%налог%'. Тут уж ничего не поделаешь, функциональность такая...
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите с составлением запроса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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