|
Хитрый запрос
|
|||
---|---|---|---|
#18+
Народ, подскажите плиз. Имеются две таблицы, в одной хранятся имена городов, а в другой их численность. Эти таблицы связаны по ID города. Как вывести все города и их численности, но необходимо учесть, что не для всех городов есть численность (т.е. в таблицы численность не содержится ID этого города), т.е. для города у которого нет численности можно не выводить численность или вывести 0. Запрос не должен использовать UNION!!!! ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2002, 22:10 |
|
Хитрый запрос
|
|||
---|---|---|---|
#18+
in 8i and 9i: select c.city_id, c.city_name, p.population from cities c, pops p where c.city_id = p.city_id(+); in 9i: select c.city_id, c.city_name, p.population from cities c left outer join pops p on c.city_id = p.city_id; ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2002, 22:32 |
|
Хитрый запрос
|
|||
---|---|---|---|
#18+
Спасибо большое, помогло. Поясни плиз, если нетрудно.конструкцию where (+) в первом запросе, и from во втором. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2002, 01:28 |
|
Хитрый запрос
|
|||
---|---|---|---|
#18+
(+) обозначает т.н. "внешнее соединение" (если не перепутал). В кратце, ты заранее объявляешь, что с той стороны, где у тебя стоит "(+)" у тебя может и не быть значения для сравнения. В твоём случае, это обозначает, что выбрать те строки, где c.city_id = p.city_id, и те строки где для c.city_id нет вообще соотв. значения в p.city_id. Причём для значений соотв. полей выбираемых из p используется значение NULL. А второй вариант -- нетривиальное для понимания (сугубо моё IMHO) "извращение" пришедшее от MS SQL и Access. Семантика одна и та же, но понять, какая из таблиц та "в которой нет соотв. значений ключа" достаточно сложно, так же как выделить названия полей, по которым идёт связка. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2002, 02:13 |
|
Хитрый запрос
|
|||
---|---|---|---|
#18+
Второй вариант в точности соответсвует стандарту ANCI/ISO для SQL 92. К счастью MS руку к этому стандарту практически не приложил. Синтаксис INNER/OUTER JOIN пришел из IBM DB2 и он мощнее, чем синтаксис Oracle. В Oracle FULL OUTER JOIN можно было сделать тольку через UNION (до 9i), теперь в соответствии со стандартом что радует. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2002, 08:35 |
|
Хитрый запрос
|
|||
---|---|---|---|
#18+
Так всё таки может поясните вторую конструкцию, и если можно то дайте ссылку, где про это можно почитать (желательно на русском). Заранее большое спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2002, 01:41 |
|
Хитрый запрос
|
|||
---|---|---|---|
#18+
"in 9i: select c.city_id, c.city_name, p.population from cities c left outer join pops p on c.city_id = p.city_id;" А как сейчас решён вопрос в этой форме, который ранее при использовании "+" говорил, что столбец с этим знаком должен быть справа от "=", иначе оптимизатор не сможет оптимизировать запрос? Как правильно соединять теперь? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2002, 09:13 |
|
Хитрый запрос
|
|||
---|---|---|---|
#18+
Вспомнил за что не люблю эти "JOIN" -- FROM становится абсолютно нечитаемым в случае если внешне связывается три и более таблицы. У плюсиковой нотации в этом отношении плюс :), что явно видны все таблицы учавствующие в запросе. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2002, 01:30 |
|
Хитрый запрос
|
|||
---|---|---|---|
#18+
Будь поосторожнее со сравнением данных вариантов синтаксиса, они немного разные. Пример: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
А теперь, запрос с (+), только с дополнительным условием по "внешней" таблице: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
запрос с left outer join: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Для достижения того же результата первый запрос следует переписать: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Согласись, что он несколько потерял наглядность? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2002, 19:22 |
|
Хитрый запрос
|
|||
---|---|---|---|
#18+
Все наглядно: select t.test_id , t2.test_id test2_id from test t , test2 t2 where 1=1 and t.test_id = t2.test_id (+) and nvl(t2.test_id,2) = 2 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2002, 06:21 |
|
Хитрый запрос
|
|||
---|---|---|---|
#18+
Да, это еще один способ корректировки запроса. Повторю лишь: стоит очень осторожно подходить к переписыванию запроса с одного синтаксиса на другой, можно получить различные результаты. В Sybase и MSSQL для внешнего соединения используется символ * возле знака =; так вот, если мне не изменяет память, то при указании конкретного значения поля вов внешней таблице получаются данные, аналогичные оракловой реализации синтаксиса с outer join, а не синтаксиса с (+), что еще больше усложняет задачу переноса кода с одного сервера на другой. Если у кого есть вожможность, проверьте пожалуйста, я могу ошибаться. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2002, 10:24 |
|
|
start [/forum/topic.php?fid=52&fpage=2829&tid=1992575]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
31ms |
get topic data: |
31ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
others: | 296ms |
total: | 438ms |
0 / 0 |