Создание запроса 1->m

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
SSA
Сообщения: 2
Зарегистрирован: 11 авг 2007, 14:56

Создание запроса 1->m

Сообщение SSA » 11 авг 2007, 15:10

Как создать запрос. Есть таблица первого уровня. От нее есть таблицы второго уровня. Связь один ко многим. В одной таблице второго уровня есть одна запись, в другой таблице второго уровня 2 записи. Нужно получить запрос след-го вида:

Данные табл. 1 ур Данные табл 1 2-го ур Данные табл 2 2-го ур.
Данные табл. 1 ур ДОЛЖНО БЫТЬ ПУСТО Данные табл 2 2-го ур.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 11 авг 2007, 20:54


SSA
Сообщения: 2
Зарегистрирован: 11 авг 2007, 14:56

Сообщение SSA » 11 авг 2007, 23:21

Я наверное не совсем точно описал задачу. Про объединения я знаю.
Задача состоит в следующем. Есть пациент ИВАНОВ В.В. в таблице ПАЦИЕНТ (первый уровень). Есть еще две таблицы ДЕФОРМАЦИЯ НА ЛЕВОЙ СТОПЕ и ДЕФОРМАЦИЯ НА ПРАВОЙ СТОПЕ (второй уровень). Эти таблицы связаны с таблицей ПАЦИЕНТ (один пациент и много видов деформаций на правой стопе или на левой), т.е. эти две таблицы реализуют "множественный выбор". Допустим у ИВАНОВА В.В есть 3 деформации на правой стопе (3 записи в таблице ДЕФОРМАЦИЯ НА ПРАВОЙ СТОПЕ) и 3 деформации на левой стопе (3 записи в таблице ДЕФОРМАЦИЯ НА ЛЕВОЙ СТОПЕ). Нужно построить запрос, который отберет просто всех пациентов, а также выведет деформации левой и правой стопы (неважно есть они или нет). Я строил запрос типа
SELECT
ПАЦИЕНТ.*,
ДЕФОРМАЦИЯ НА ПРАВОЙ СТОПЕ.ВИД,
ДЕФОРМАЦИЯ НА ЛЕВОЙ СТОПЕ.ВИД
FROM
ПАЦИЕНТ
LEFT JOIN ДЕФОРМАЦИЯ НА ПРАВОЙ СТОПЕ и т.д.
LEFT JOIN ДЕФОРМАЦИЯ НА ЛЕВОЙ СТОПЕ и т.д.
В результате получаю выборку:

ИВАНОВ ДЛ1 ДП1
ИВАНОВ ДЛ2 ДП1
ИВАНОВ ДЛ3 ДП1

ИВАНОВ ДЛ1 ДП2
ИВАНОВ ДЛ2 ДП2
ИВАНОВ ДЛ3 ДП2

ИВАНОВ ДЛ1 ДП3
ИВАНОВ ДЛ2 ДП3
ИВАНОВ ДЛ3 ДП3

а нужно в виде

ИВАНОВ ДЛ1 ДП1
ИВАНОВ ДЛ2 ДП2
ИВАНОВ ДЛ3 ДП3 или

ИВАНОВ ДЛ1 ДП2
ИВАНОВ ДЛ2 ДП3
ИВАНОВ ДЛ3 ДП1 или

(это уже не важно, главное чтобы было три записи из 9)


Можно ли сделать такое одним запросом???????

Attid
Спец
Сообщения: 377
Зарегистрирован: 14 ноя 2006, 09:58

Сообщение Attid » 12 авг 2007, 00:01

если я правельно понял то только через процедуру.
или кросс отчет на клиенте

Slavik
Сообщения: 115
Зарегистрирован: 17 янв 2007, 11:52

Сообщение Slavik » 12 авг 2007, 11:29

Attid писал(а):если я правельно понял то только через процедуру.
или кросс отчет на клиенте
Ну почему же. Если список видов деформаций единый для левой и правой стопы (1,2,3,...), то можно ещё группировкой по пациенту и виду деформации или (если FB2) соединением пациентов и видов деформаций стопы с подзапросом, который возвращает наличие конкретного вида деформации левой и правой стопы.

P.S. Только недавно я приводил на этом форуме примеры подобных запросов.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 13 авг 2007, 10:17

SSA писал(а):Я наверное не совсем точно описал задачу.
Описал задачу ясно. И kdv тебя правильно направил.
Надо ещё только чуточку сильнее мозг наморщить.
Деформации у тебя никакого порядка не имеют? Как именно ты узнал, что это "ДЛ1", а не "ДЛ2"?
В связке, где второй лефт, добавляешь условие соединение дополнительное, по этому номеру.

Если ты порядок не предусмотрел, то сгодится уникальный ID, но тут запрос будет посложнее.

ЗЫ: Кстати, а почему в разделе "Ремонт БД"?

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 13 авг 2007, 10:24

SSA писал(а):
а также выведет деформации левой и правой стопы (неважно есть они или нет).
Неважно? Врач сказал в морг, значит в морг? :D
ЗЫ
Да, кстати, на каждое заболевание своя таблица создается?

Ответить