Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
14-1130769498
Андрей Жук
2005-10-31 17:38
2005.11.20
Подскажите, как писать характеристику


14-1130428910
Gydvin
2005-10-27 20:01
2005.11.20
Помогите выбрать принтер


1-1130321591
Prohodil Mimo
2005-10-26 14:13
2005.11.20
Как добавлять VCL (Win32) компоненты в Delphi 2005?


2-1131047306
Eksell
2005-11-03 22:48
2005.11.20
Kak v Console ochisteti ekran?


2-1130455887
Blur
2005-10-28 03:31
2005.11.20
Как сделать имеджу небольшой блюр ?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский