Создание запроса 1->m
Модератор: kdv
Создание запроса 1->m
Как создать запрос. Есть таблица первого уровня. От нее есть таблицы второго уровня. Связь один ко многим. В одной таблице второго уровня есть одна запись, в другой таблице второго уровня 2 записи. Нужно получить запрос след-го вида:
Данные табл. 1 ур Данные табл 1 2-го ур Данные табл 2 2-го ур.
Данные табл. 1 ур ДОЛЖНО БЫТЬ ПУСТО Данные табл 2 2-го ур.
Данные табл. 1 ур Данные табл 1 2-го ур Данные табл 2 2-го ур.
Данные табл. 1 ур ДОЛЖНО БЫТЬ ПУСТО Данные табл 2 2-го ур.
Я наверное не совсем точно описал задачу. Про объединения я знаю.
Задача состоит в следующем. Есть пациент ИВАНОВ В.В. в таблице ПАЦИЕНТ (первый уровень). Есть еще две таблицы ДЕФОРМАЦИЯ НА ЛЕВОЙ СТОПЕ и ДЕФОРМАЦИЯ НА ПРАВОЙ СТОПЕ (второй уровень). Эти таблицы связаны с таблицей ПАЦИЕНТ (один пациент и много видов деформаций на правой стопе или на левой), т.е. эти две таблицы реализуют "множественный выбор". Допустим у ИВАНОВА В.В есть 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)
Можно ли сделать такое одним запросом???????
Задача состоит в следующем. Есть пациент ИВАНОВ В.В. в таблице ПАЦИЕНТ (первый уровень). Есть еще две таблицы ДЕФОРМАЦИЯ НА ЛЕВОЙ СТОПЕ и ДЕФОРМАЦИЯ НА ПРАВОЙ СТОПЕ (второй уровень). Эти таблицы связаны с таблицей ПАЦИЕНТ (один пациент и много видов деформаций на правой стопе или на левой), т.е. эти две таблицы реализуют "множественный выбор". Допустим у ИВАНОВА В.В есть 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)
Можно ли сделать такое одним запросом???????
Ну почему же. Если список видов деформаций единый для левой и правой стопы (1,2,3,...), то можно ещё группировкой по пациенту и виду деформации или (если FB2) соединением пациентов и видов деформаций стопы с подзапросом, который возвращает наличие конкретного вида деформации левой и правой стопы.Attid писал(а):если я правельно понял то только через процедуру.
или кросс отчет на клиенте
P.S. Только недавно я приводил на этом форуме примеры подобных запросов.
Описал задачу ясно. И kdv тебя правильно направил.SSA писал(а):Я наверное не совсем точно описал задачу.
Надо ещё только чуточку сильнее мозг наморщить.
Деформации у тебя никакого порядка не имеют? Как именно ты узнал, что это "ДЛ1", а не "ДЛ2"?
В связке, где второй лефт, добавляешь условие соединение дополнительное, по этому номеру.
Если ты порядок не предусмотрел, то сгодится уникальный ID, но тут запрос будет посложнее.
ЗЫ: Кстати, а почему в разделе "Ремонт БД"?