![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Oracle [D7]
McSimm2 © (2003-06-25 15:25:00)Как можно соптимизировать запрос?
Такая ситуация, мне нужно после where указывать равенство 3 полей из одного и того же запроса:
...
WHERE n_lc IN (SELECT k.n_lc
FROM table1 k, table2.dom d
WHERE (d.ulica = k.ulica(+) AND d.dom = k.dom(+))
AND UPPER (k.ulica) LIKE "%XXX%")
AND jeu IN (SELECT k.jeu
FROM table1 k, table2.dom d
WHERE (d.ulica = k.ulica(+) AND d.dom = k.dom(+))
AND UPPER (k.ulica) LIKE "%XXX%")
AND rajon IN (SELECT k.rajon
FROM table1 k, table2.dom d
WHERE (d.ulica = k.ulica(+) AND d.dom = k.dom(+))
AND UPPER (k.ulica) LIKE "%XXX%")
Как нибудь можно это сократить ???
Sandman25 (2003-06-25 16:56:00) [1]Проверяет, что в table1 и table2.dom есть соответсвующая инфо. При этом не важно, сколько именно строк удовлетворяют условию связи, и исходные данные будут суммироваться только 1 раз (если удовлетворяют условию связи).
McSimm2 (2003-06-25 16:06:00) [2]Sandman25 © (25.06.03 15:58)
а что в данном случае exists делает ?
Sandman25 (2003-06-25 15:58:00) [3]Нижняя строка "and rajon=k.rajon"
по ошибке редактирования прошла.
McSimm2 (2003-06-25 15:56:00) [4]roottim (25.06.03 15:47)
Отлично работает !!!
Sandman25 (2003-06-25 15:53:00) [5]По варианту kravchuk © (25.06.03 15:34)
если в таблицах tabl1 И table2.dom есть повторяющиеся строки (дубликаты), то связывание произойдет несколько раз (вместо 1). В таком случае лучше использовать
...
FROM T
...
AND EXISTS
(SELECT *
FROM table1 k, table2.dom d
WHERE
d.ulica = k.ulica(+) AND d.dom = k.dom(+))
AND UPPER (k.ulica) LIKE "%XXX%"
and T.n_lc=k.n_lc
and T.jeu =k.jeu
and T.rajon = k.rajon
)
and rajon=k.rajon
roottim (2003-06-25 15:47:00) [6]МОЖНО!
McSimm2 (2003-06-25 15:45:00) [7]roottim (25.06.03 15:43)
Ага - вот я это и имел в виду - можно ли так делать ??? Мне просто это очень сложно проверить - результат запроса -большие и большие цифры....
McSimm2 (2003-06-25 15:45:00) [8]Sandman25 © (25.06.03 15:44)
Что значит опасность повторений ?
Sandman25 (2003-06-25 15:44:00) [9]Еще можно попробовать EXISTS, если есть опасность повторений.
roottim (2003-06-25 15:43:00) [10]ну вообще такой запрос должен отработать
WHERE (n_lc, jeu, rajon)
IN (SELECT k.n_lc, k.jeu, k.rajon
FROM table1 k, table2.dom d
WHERE (d.ulica = k.ulica(+) AND d.dom = k.dom(+))
AND UPPER (k.ulica) LIKE "%XXX%")
McSimm2 (2003-06-25 15:41:00) [11]Не,- так нельзя, смысл в том,что в селекте у меня идут только вычисляемые поля и если во внешний where вынести условия из вложенных запросов - то основной запрос не пройдёт, т.к. не сможет тогда посчитать сумму...
Select sum(t.sum_field1) as sum1, sum(t.sum_field2) as sum2
from table0 t
WHERE t.n_lc IN (SELECT k.n_lc
FROM table1 k, table2.dom d
WHERE (d.ulica = k.ulica(+) AND d.dom = k.dom(+))
AND UPPER (k.ulica) LIKE "%XXX%")
AND t.jeu IN (SELECT k.jeu
FROM table1 k, table2.dom d
WHERE (d.ulica = k.ulica(+) AND d.dom = k.dom(+))
AND UPPER (k.ulica) LIKE "%XXX%")
AND t.rajon IN (SELECT k.rajon
FROM table1 k, table2.dom d
WHERE (d.ulica = k.ulica(+) AND d.dom = k.dom(+))
AND UPPER (k.ulica) LIKE "%XXX%")
kravchuk (2003-06-25 15:34:00) [12]попробуй :
FROM ...., table1 k, table2.dom d
WHERE
(d.ulica = k.ulica(+) AND d.dom = k.dom(+))
AND UPPER (k.ulica) LIKE "%XXX%")
and n_lc=k.n_lc
and jeu =k.jeu
and rajon=k.rajon