C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Запрос по нескольким таблицам
telepath
Отправлено: 28.02.2005, 15:36


Станционный диспетчер

Группа: Участник
Сообщений: 132



Доброго времени суток, не подскажете как создать запрос на несколько таблиц и чтобы был еще и вложенный на одну из них.
Например (неработающий пример sad.gif ) :
CODE
select org_name, per_name, (sumW+sumB) from orgs, periods_det, res
where code_id in (40) and rec_id in
(select rec_id from rec where years_num=2004 and typ_id=2 )


таблицы:
orgs — два поля (org_id, org_name)
periods_det — (per_name, per_id)
rec — (rec_id, per_id, org_id, years_num, typ_id)
res — (rec_id, sumW, sumB, code_id)

Gedeon
Отправлено: 28.02.2005, 16:08


Ветеран

Группа: Модератор
Сообщений: 1742



Почему так
SQL
code_id in (40)

а не так
SQL
code_id = 40


Ну и еще хочу посоветовать поставить имена таблиц перед полями, у Вас rec_id и в rec и в res откуда же серверу знать какой брать, чтоб было поменьше кода можна использовать псевдонимы.

ЗЫ Все ж неплохо указывать базу и ту ругань к-рая выдается при попытке выполнить запрос.

Отредактировано Gedeon — 28/02/2005, 14:11
telepath
Отправлено: 28.02.2005, 18:00


Станционный диспетчер

Группа: Участник
Сообщений: 132



Сорри,
CODE
code_id in (40)

используется при динамичном создании. там может быть и несколько значений
насчет таблиц да

база FB но она не ругается, а выдает просто все записи у которых одинаковые org_name и per_name и разные sumW
AVC
Отправлено: 28.02.2005, 18:10


Ветеран

Группа: Модератор
Сообщений: 1583



А кто будет указывать как связаны таблицы orgs, periods_det, res?
Вы получаете декартово произведение таблиц.
telepath
Отправлено: 01.03.2005, 14:10


Станционный диспетчер

Группа: Участник
Сообщений: 132



А не подскажете как это делается? В моем данном случае? По книжке что-то никак не могу разобраться sad.gif
AVC
Отправлено: 01.03.2005, 15:13


Ветеран

Группа: Модератор
Сообщений: 1583



Смотря какя связь вам нужна. В простом (и самом распространенном случае) например так

Select o.org_name, p.per_name, (res.sumW+res.sumB) as SumWB
From
orgs o
,periods_det p
,res
,rec
Where 1 = 1
-- условия связи
and res.rec_id = rec.rec_id
and o.org_id = rec.org_id
and p.per_id = rec.per_id
-- условия отбора
and rec. years_num=2004
and rec.typ_id=2
and res.code_id in (40)

где-то так если у вас inner объединения.
telepath
Отправлено: 01.03.2005, 16:53


Станционный диспетчер

Группа: Участник
Сообщений: 132



А что значит
CODE
Where 1=1

?
avc*
Отправлено: 01.03.2005, 17:29


Не зарегистрирован







Просто удобно комментировать "лишние" условия. Для этих же целей и запись
Select
Field1
,Field2
,Field3
From
Table1
,Table2
,Table3
telepath
Отправлено: 01.03.2005, 17:48


Станционный диспетчер

Группа: Участник
Сообщений: 132



А, понятно, большое спасибо! smile.gif

Вернуться в Работа с базами данных в C++Builder