запрос со связью "многие ко многим"

jimihen
Дата: 07.12.2007 12:02:20
Здравствуйте!
Подскажите, пожалуйста, как лучше реализовать выбор данных?

задача:

есть первый главный запрос, который выбирает всех пациентов, которые записаны на прием к конкретному врачу

врач ------------ пациент ------------- номер приема

Иванов ---------- Петров -------------- 11
Иванов ---------- Сидоров ------------- 12
Иванов ---------- Орлов --------------- 13

есть подзапрос, который дополнительно к каждой строчке главного запроса выбирает, куда еще данный пациент сегодня записан?

пациент ---------- врач ------------- номер приема

Петров ------------- Иванов ----------- 11
Петров ------------- Белов ------------ 15
Петров ------------- Чернов ----------- 27

Сидоров ------------ Иванов ----------- 12

Орлов -------------- Иванов ----------- 13
Орлов -------------- Чернов ----------- 26

На выходе имеем:

врач ------------ пациент ------------- номер приема

Иванов ------------- Петров -------------- 11
------------------ Петров ------------- Иванов ----------- 11
------------------ Петров ------------- Белов ------------ 15
------------------ Петров ------------- Чернов ----------- 27

Иванов ---------- Сидоров ------------- 12
------------------ Сидоров ------------ Иванов ----------- 12

Иванов ---------- Орлов --------------- 13
------------------ Орлов -------------- Иванов ----------- 13
------------------ Орлов -------------- Чернов ----------- 26

В отчете получается некрасиво, когда мы в детализации для каждого пациента повторяем уже указанный выше прием врача.
Если задавать условие, что номер приема в первом запросе не равен номру приема во втором запросе, то в первом запросе пропадают строчки, в которых пациент ходил только к этому одному врачу, т.е. таблица выглядит так:

врач ------------ пациент ------------- номер приема

Иванов ---------- Петров -------------- 11
------------------ Петров ------------- Белов ------------ 15
------------------ Петров ------------- Чернов ----------- 27

Иванов ---------- Орлов --------------- 13
------------------ Орлов -------------- Чернов ----------- 26

Скажите, пожалуйста, как бы сделать так, чтоб и лишних записей (повторяющихся) не было и все строчки главного запроса выводились?

т.е. так:

врач ------------ пациент ------------- номер приема

Иванов ---------- Петров -------------- 11
------------------ Петров ------------- Белов ------------ 15
------------------ Петров ------------- Чернов ----------- 27

Иванов ---------- Сидоров ------------- 12

Иванов ---------- Орлов --------------- 13
------------------ Орлов -------------- Чернов ----------- 26

Очень буду вам благодарна!
Jannny
Дата: 07.12.2007 12:18:22
jimihen
Если задавать условие, что номер приема в первом запросе не равен номру приема во втором запросе, то в первом запросе пропадают строчки, в которых пациент ходил только к этому одному врачу
Просто наоборот. Исключаете из второго подзапроса, где одинаковый номер, а не из первого.
Евгений_25
Дата: 07.12.2007 12:34:45
WITH a AS (select 'petrov' doctor, 'ivanov' client, 11 TIME FROM dual 
	    UNION
	   select 'petrov' doctor,'ivanov2' client, 12 TIME FROM dual 
	    UNION
	   select 'petrov' doctor, 'ivanov3' client, 13 TIME FROM dual
	   ),
     b AS (select 'petrov' doctor, 'ivanov' client, 11 TIME FROM dual 
	    UNION
	   select 'petrov2' doctor, 'ivanov' client, 12 TIME FROM dual 
	    UNION
	   SELECT 'petrov3' doctor, 'ivanov' client, 13 TIME FROM dual 
	    UNION
	   SELECT 'petrov4' doctor, 'ivanov' client, 14 TIME FROM dual 
	    UNION
	   select 'petrov' doctor, 'ivanov2' client, 12 TIME FROM dual 
	    UNION
	   select 'petrov' doctor, 'ivanov3' client, 13 TIME FROM dual 
	    UNION
	   SELECT 'petrov3' doctor, 'ivanov3' client, 14 TIME FROM dual)			 
SELECT a.doctor,b.client,b.doctor,b.time 
  FROM a,b 
 WHERE a.doctor(+)=b.doctor 
   AND a.client(+)=b.client
 ORDER BY b.client,b.doctor
   	DOCTOR	CLIENT	DOCTOR	TIME
1	petrov	ivanov	petrov	11
2		ivanov	petrov2	12
3		ivanov	petrov3	13
4		ivanov	petrov4	14
5	petrov	ivanov2	petrov	12
6	petrov	ivanov3	petrov	13
7		ivanov3	petrov3	14