Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Другие СУБД [игнор отключен] [закрыт для гостей] / Paradox и сложный запрос таблицам. / 2 сообщений из 2, страница 1 из 1
02.04.2013, 14:29
    #38209149
Paradox и сложный запрос таблицам.
Доброго всем времени суток. Позвольте задать вопрос. Работаю с paradox7. В нем имеется база для простоты, к примеру, с двумя табличками:

company
--------
ID_company - autoincrement - PK
Name - alpha(255)
FIO - alpha(255)
Pozition_ID - longint - FK (pozition)
Adres - alpha(255)
Phone - alpha(30)
Site - alpha(255)
Mail - alpha(255)

pozition
-------
ID_pozition - autoincrement - PK
Name - alpha(255)

При этом в таблице company поле Pozition_ID - не обязательное. Иными словами там или NULL, или айди совпадающий с номером из второй таблицы.

Необходимо вывести в селекте, например, информацию о компаниях на букву "А". При этом в некоторых из них поля FIO (ФИО начальника) и Pozition_ID (название его должности из второй таблицы) заполнены, а в некоторых - нет.

если запрос строю так:

SELECT distinct company.Name, company.FIO, pozition.Name, company.Adres, company.Phone, company.Site, company.Mail

FROM company, pozition

WHERE company.Name like 'A%'

ORDER by company.Name

то результат не верен. Оговорюсь, что компаний, отвечающих данному условию (название начинается с буквы "А") в моей базе всего две - одна с указанным ФИО и должностью, вторая - без. При этом в таблице pozition имеются 24 разных должности. Запрос отрабатывает и возвращает 2 * 24 = 48 результатов, где сначала идет информация о первой компании (с меняющимися 24 разными должностями), а потом то же самое про вторую компанию. И не важно, заполненны ли поля FIO и Pozition_ID или нет.

Можно, конечно, переписать условия выборки так:

WHERE company.Name like 'A%' and company.Pozition_ID = pozition.ID_pozition

чтобы пказать все строчки, где поля заполнены и так:

WHERE company.Name like 'A%' and company.Pozition_ID IS NULL

чтобы вторым запросом вывести остальных, но в моей базе в таблице company таких полей со ссылкой на другие таблицы не одно, а целых пять ( я лишь для простоты указал здесь один форинкей). Подскажите пожалуйста, как правильно построить запрос, чтобы получить правильный ответ?
...
Рейтинг: 0 / 0
03.04.2013, 10:06
    #38210447
const64
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Paradox и сложный запрос таблицам.
Смирнов ВладимирSELECT distinct company.Name, company.FIO, pozition.Name, company.Adres, company.Phone, company.Site, company.Mail

FROM company, pozition

WHERE company.Name like 'A%'

ORDER by company.Name

то результат не верен. Оговорюсь, что компаний, отвечающих данному условию (название начинается с буквы "А") в моей базе всего две - одна с указанным ФИО и должностью, вторая - без. При этом в таблице pozition имеются 24 разных должности. Запрос отрабатывает и возвращает 2 * 24 = 48 результатов, где сначала идет информация о первой компании (с меняющимися 24 разными должностями), а потом то же самое про вторую компанию. И не важно, заполненны ли поля FIO и Pozition_ID или нет.

Вполне естественно: т.к. Вы не указываете условие соединения таблиц то кол-во строк в результирующей табл. равно произведению кол-ва строк в первой таблице (с учетом WHERE) на кол-во строк во второй табл.

Правильный запрос будет такой (практически пример из LOCALSQL.HLP на OUTER join):
Код: sql
1.
2.
3.
4.
5.
SELECT DISTINCT company.Name, company.FIO, pozition.Name, company.Adres, company.Phone, company.Site, company.Mail
FROM company
LEFT OUTER JOIN pozition ON pozition.ID_pozition=company.Pozition_ID
WHERE company.Name like 'A%'
ORDER by company.Name

(ключевое слово OUTER можно опустить...)
...
Рейтинг: 0 / 0
Форумы / Другие СУБД [игнор отключен] [закрыт для гостей] / Paradox и сложный запрос таблицам. / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]