Форум: "Базы";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];
ВнизПробл. с объединением 4 таблиц Найти похожие ветки
← →
jiny (2005-10-06 09:57) [0]Раньше запрос формировался так
SELECT FR1_1.*, FR1_2.*
FROM FR1_1, FR1_2
WHERE FR1_2.id = FR1_1.id and FR1_1.id = :id
order by FR1_2.NAME_TOV
теперь возникла необходимость указывать в документе к какому сектору склада товар относится,
в табл.tovar есть поле num_sct, где указан ID сектора,
нужно к таблице FR1_2 подключить табл. Tovar , а именно поле num_sct, и к этому полю подключить название сектора и описание из таблицы skd_sector (name_sct,comment)
Делаю так :SELECT FR1_1.*, FR1_2.*,tovar.num_sct,skd_sector.name_sect FROM FR1_1, FR1_2 left outer join tovar on tovar.num_tov=fr1_2.id_tov left outer join skd_sector on skd_sector.num_sct=tovar.num_skt
WHERE FR1_2.id = FR1_1.id and FR1_1.id = :id order by FR1_2.NAME_TOV
Помогите решить данную задачу.
Заранее благодарен
← →
msguns © (2005-10-06 10:07) [1]1. Почему Left OUTER ?
2. Связки делать либо через WHERE, либо JOIN, но не их комбинации
3. Для выборки из справочников можно использовать подзапросы
← →
Виталий Панасенко (2005-10-06 10:09) [2]а как FR1_2 связана с таблицей Tovar ?
← →
Виталий Панасенко (2005-10-06 10:10) [3]вообще, связей не видно...
← →
Johnmen © (2005-10-06 10:15) [4]>msguns © (06.10.05 10:07) [1]
>1. Почему Left OUTER ?
Потому, что LEFT всегда OUTER :)
← →
jiny (2005-10-06 10:34) [5]
> Виталий Панасенко (06.10.05 10:09) [2]
> а как FR1_2 связана с таблицей Tovar ?
Fr1_2.id_tov = Tovar.num_tov
← →
jiny (2005-10-06 10:39) [6]
> msguns © (06.10.05 10:07) [1]
> 1. Почему Left OUTER ?
> 2. Связки делать либо через WHERE, либо JOIN, но не их комбинации
> 3. Для выборки из справочников можно использовать подзапросы
1. В принципе этот метод никогда не подводил и из опробованных мною методов join этот оказался самый быстрый для моих задач
2. Всегда делал и всегда получалось, вот например :SELECT katdoc.isVozvrat,katdoc.isFilial,katDoc.isCollege,katdoc.buh,shapka.id,shapka.num_doctype,
shapka.kat,shapka.name_kat,shapka.name_doc,shapka.name_kl,
shapka.data_sd,shapka.doctype, spisok.serias, spisok.cost_sd,spisok.kol,
cast(0 as numeric(15,2)) as ost_prih,cast(0 as numeric(15,2)) as ost_rash,cast(0 as numeric(15,2)) as ost_inner_In,spisok.kol as ost_Inner_Out,
spisok.p_jrn,spisok.name_tov,spisok.izm,spisok.serias");
FROM FRFil1_1 shapka left outer join katdoc on shapka.kat=katdoc.num_kat,FRFil1_2 spisok
WHERE spisok.id=shapka.id and id_skd_from="+Inttostr(_MF_SKLAD)+" and isVozvrat<>1 "+tmpSerOrTov+" and spisok.flag=1 and num_mainfirm=:num_mainfirm "+filter_date+Filter_Kl
3. это да, щас попробую, звучит вполне реалистично, спасибо.
← →
Виталий Панасенко (2005-10-06 10:42) [7]SELECT FR1_1.*, FR1_2.*, Tovar.num_sct
FROM FR1_1, FR1_2, Tovar
WHERE FR1_2.id = FR1_1.id and FR1_1.id = :id and FR1_2.id_tov=Tovar.id_tov
order by FR1_2.NAME_TOV
← →
msguns © (2005-10-06 10:42) [8]>Johnmen © (06.10.05 10:15) [4]
>Потому, что LEFT всегда OUTER :)
Неужели ? См. справку по Local SQL:
...
SELECT column_list
FROM table_reference
[INNER] JOIN table_reference
ON predicate
...
Т.е. по умолчанию как бы INNER ;)
С другой стороны читаем далее:
SELECT column_list
FROM table_reference
LEFT | RIGHT | FULL [OUTER] JOIN table_reference
ON predicate
[LEFT | RIGHT | FULL [OUTER] JOIN table_reference
ON predicate..
The primary difference between inner and outer joins is that, in outer joins rows from the source table that do not have a match in the joining table are not excluded from the result set. Columns from the joining table for rows in the source table without matches have NULL values.
И получается, что INNER как бы аналогична WHERE..
Посмотрел свои "тряпки" и обнаружил, что всегда пишу просто LEFT JOIN, а получаю вроде как OUTER, т.е. полный список из осн.таблицы, хотя по умолчанию вроде д.б. INNER
Оказываевается, все дело в волшебном слове LEFT ! Опять смотрим справку и что мы видим ? Правильно !
The LEFT modifier causes all rows from the table on the left of the OUTER JOIN operator to be included in the result set, with or without matches in the table to the right. If there is no matching row from the table on the right, its columns contain NULL values. The RIGHT modifier causes all rows from the table on the right of the OUTER JOIN operator to be included in the result set, with or without matches. If there is no matching row from the table on the left, its columns contain NULL values. The FULL modifier causes all rows from the all tables specified in the FROM clause to be included in the result set, with or without matches. If there is no matching row from one of the tables, its columns contain NULL values.
В общем, ты, как обычно, прав ;)))
← →
Виталий Панасенко (2005-10-06 10:44) [9]SELECT FR1_1.*, FR1_2.*, Tovar.num_sct
FROM FR1_1, FR1_2, Tovar
WHERE FR1_2.id = FR1_1.id and FR1_1.id = :id and FR1_2.id_tov=Tovar.num_tov
order by FR1_2.NAME_TOV
просто автоматом подумалось, что имена полей одинаковые..
← →
msguns © (2005-10-06 10:47) [10]>Виталий Панасенко (06.10.05 10:44) [9]
Опять неверно. Попробуй еще раз ;)
← →
jiny (2005-10-06 10:58) [11]Спасибо всем, особенно огромное :
> msguns © (06.10.05 10:07) [1]
> 3. Для выборки из справочников можно использовать подзапросы
Это помогло, без потери скорости запроса
сделал так :SELECT FR1_1.*, FR1_2.*,tovar.num_sct,
(select name_sct from skd_sector
where skd_sector.num_sct=tovar.num_sct) as name_sct
FROM FR1_1, FR1_2 left outer join tovar on
tovar.num_tov=fr1_2.id_tov
WHERE FR1_2.id = FR1_1.id and FR1_1.id = :id
order by FR1_2.NAME_TOV
← →
Anatoly Podgoretsky © (2005-10-06 10:58) [12]Johnmen © (06.10.05 10:15) [4]
Это Inner всегда Left, а огеук может быть любой
← →
Johnmen © (2005-10-06 11:09) [13]>Anatoly Podgoretsky © (06.10.05 10:58) [12]
Анатолий, ты ещё не проснулся...:)
← →
Виталий Панасенко (2005-10-06 11:22) [14]
> msguns © (06.10.05 10:47) [10]
> >Виталий Панасенко (06.10.05 10:44) [9]
>
> Опять неверно. Попробуй еще раз ;)
Не могу !.. И так хреново !..:-)))
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.059 c