Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.07.17;
Скачать: [xml.tar.bz2];

Вниз

---|Ветка была без названия|---   Найти похожие ветки 

 
McSimm2   (2003-06-25 15:25) [0]

Как можно соптимизировать запрос?
Такая ситуация, мне нужно после 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%")

Как нибудь можно это сократить ???


 
kravchuk   (2003-06-25 15:34) [1]

попробуй :


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


 
McSimm2   (2003-06-25 15:41) [2]

Не,- так нельзя, смысл в том,что в селекте у меня идут только вычисляемые поля и если во внешний 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%")


 
roottim   (2003-06-25 15:43) [3]

ну вообще такой запрос должен отработать
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%")


 
Sandman25   (2003-06-25 15:44) [4]

Еще можно попробовать EXISTS, если есть опасность повторений.


 
McSimm2   (2003-06-25 15:45) [5]

roottim (25.06.03 15:43)

Ага - вот я это и имел в виду - можно ли так делать ??? Мне просто это очень сложно проверить - результат запроса -большие и большие цифры....


 
McSimm2   (2003-06-25 15:45) [6]

Sandman25 © (25.06.03 15:44)

Что значит опасность повторений ?


 
roottim   (2003-06-25 15:47) [7]

МОЖНО!


 
Sandman25   (2003-06-25 15:53) [8]

По варианту 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



 
McSimm2   (2003-06-25 15:56) [9]

roottim (25.06.03 15:47)

Отлично работает !!!


 
Sandman25   (2003-06-25 15:58) [10]

Нижняя строка "and rajon=k.rajon"
по ошибке редактирования прошла.


 
McSimm2   (2003-06-25 16:06) [11]

Sandman25 © (25.06.03 15:58)

а что в данном случае exists делает ?


 
Sandman25   (2003-06-25 16:56) [12]

Проверяет, что в table1 и table2.dom есть соответсвующая инфо. При этом не важно, сколько именно строк удовлетворяют условию связи, и исходные данные будут суммироваться только 1 раз (если удовлетворяют условию связи).



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.07.17;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.01 c
3-55398
Andrey007
2003-06-23 13:32
2003.07.17
Как редактировать текст в DBMemo?


3-55391
Alexander Vasjuk
2003-06-20 13:12
2003.07.17
TIBDataSet: Проблема с генератором


1-55565
SergP
2003-07-05 23:52
2003.07.17
Какие есть в Delphi функции для работы с regular expression?


14-55826
panov
2003-06-23 19:50
2003.07.17
А здесь что, филиал www.sql.ru?


1-55510
Ш-К
2003-07-04 16:50
2003.07.17
Скроллинг листбокса.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский