powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / связь один ко многим
22 сообщений из 22, страница 1 из 1
связь один ко многим
    #32331125
Yegoriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть две таблицы - таблица людей PERSON - и таблица образования EDUCATION -
связь один ко многим - так как у одного человека может быть несколько образований
(связаны таблицы по полю PERSON_ID).
Как создать запрос
который бы выбирал только тех людей у которых есть и ЭТО образование и ЭТо образование???
то есть типа SELECT PERSON_ID FROM EDUCATION WHERE PERSON_EDUCATION = 'высшее'
AND PERSON_EDUCATION = 'среднее'
...
Рейтинг: 0 / 0
связь один ко многим
    #32331184
Могун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Должна быть уникальность пар PESON_ID - PERSON_EDUCATION, или можно и без нее:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT DISTINCT
  E.PERSON_ID
FROM 
  EDUCATION E
WHERE
   1 <=(SELECT COUNT(*) FROM EDUCATION E1 WHERE E1.PERSON_ID=E.PERSON_ID AND E1.PERSON_EDUCATION='высшее')
and  1 <=(SELECT COUNT(*) FROM EDUCATION E2 WHERE E2.PERSON_ID=E.PERSON_ID AND E2.PERSON_EDUCATION='среднее')
...
Рейтинг: 0 / 0
связь один ко многим
    #32331203
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На самом деле есть много способов, различных по оптимизации. Можно так, например:

Код: plaintext
1.
2.
3.
4.
SELECT PERSON_ID
FROM EDUCATION
WHERE PERSON_EDUCATION='высшее' OR PERSON_EDUCATION='среднее'
GROUP BY PERSON
HAVING COUNT(*)> 1 
...
Рейтинг: 0 / 0
связь один ко многим
    #32331211
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажись я по утреннему стормозил Этот запрос вернёт людей с 2-мя средними образованиями, к примеру, если такое чудо возможно Поэтому надо написать так:

Код: plaintext
1.
2.
3.
4.
SELECT PERSON_ID
FROM EDUCATION
WHERE PERSON_EDUCATION='высшее' OR PERSON_EDUCATION='среднее'
GROUP BY PERSON
HAVING COUNT(DISTINCT PERSON_EDUCATION)> 1 
...
Рейтинг: 0 / 0
связь один ко многим
    #32331396
nik_x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это, что ли?

create table person(id numeric,name varchar(32));
create table education (id_person numeric, name varchar(32));
insert into person values(1,'vasya');
insert into person values(2,'petya');
insert into person values(3,'vanya');
insert into education values(1,'high school');
insert into education values(1,'interbase dba');
insert into education values(2,'college');
commit;
select person.name,education.name
from person left join education on person.id=education.id_person;

NAME NAME1
==================== ==================
vasya high school
vasya interbase dba
petya college
vanya <null>
...
Рейтинг: 0 / 0
связь один ко многим
    #32331744
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
SELECT DISTINCT PERSON_ID 
FROM PERSON_EDUCATION
WHERE PERSON_EDUCATION='высшее' OR PERSON_EDUCATION='среднее'
...
Рейтинг: 0 / 0
связь один ко многим
    #32331750
Могун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Johnmen :

;) Двойка Вам, уважаемый...
...
Рейтинг: 0 / 0
связь один ко многим
    #32332036
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Могун

Если за опечатку в имени тбл, то действительно весело :)
Если нет, то поясни... Просто интересно. Т.к. запрос абсолютно верен.
...
Рейтинг: 0 / 0
связь один ко многим
    #32332549
Yegoriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Johnmen

Этот запрос в корне не верен потому как он вернет тех людей у которых есть или среднее или высшее образование а надо чтобы и среднее и высшее
...
Рейтинг: 0 / 0
связь один ко многим
    #32332587
Могун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Присоединяюсь к Yegoriy относительно постинга Johnmen.

2Johnmen:
Вас запрос верен лишь синтаксически, но не решает поставленной задачи, а раз задача не решена, то ответ не верен. Тем более тот, кто задал вопрос, изначально так и писал(за исключением DISTINCT), но это не явилось решением задачи.
...
Рейтинг: 0 / 0
связь один ко многим
    #32332926
S.G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
S.G
Гость
А разве можно иметь высшее образование, не имея среднего?
Т.е. любая степень образования должна включать в себя "нижние".
...
Рейтинг: 0 / 0
связь один ко многим
    #32333061
Фотография Rin@t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 S.G.
Может:
1) техникум + вуз;
2) пту + вуз;
3) цпш + вуз.
...
Рейтинг: 0 / 0
связь один ко многим
    #32333062
Yegoriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
S.G
В принципе конечно нельзя иметь высшее образование не имея допустим начального - но можно иметь несколько специальных, или несколько высших
...
Рейтинг: 0 / 0
связь один ко многим
    #32333146
Void!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В принципе, здесь должна быть связь многих ко многим поскольку одно и то же образование могут иметь несколько людей. Поэтому нужна еще одна таблица
...
Рейтинг: 0 / 0
связь один ко многим
    #32333154
Фотография Rin@t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Void!

Я придерживаюсь такого же мнения. "Персона" и "Образование" есть две разные сущности, которые могут существовать независимо друг от друга.
...
Рейтинг: 0 / 0
связь один ко многим
    #32333341
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Могун
>Yegoriy

Каков вопрос, таков и ответ :)
Если опустить все приведенные здесь соображения по поводу такой сущности, как "образование", и подойти чисто формально и утилитарно, то слегка подправив <Могун>, получим :

SELECT DISTINCT E.PERSON_ID
FROM EDUCATION E
WHERE
(EXISTS (SELECT * FROM EDUCATION E1
WHERE E1.PERSON_ID=E.PERSON_ID AND
E1.PERSON_EDUCATION='высшее')) AND
(EXISTS (SELECT * FROM EDUCATION E2
WHERE E2.PERSON_ID=E.PERSON_ID AND
E2.PERSON_EDUCATION='среднее'))
...
Рейтинг: 0 / 0
связь один ко многим
    #32333375
Могун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Johnmen:

Вопрос как раз довольно внятный, а править меня не надо... Я и так хорош
...
Рейтинг: 0 / 0
связь один ко многим
    #32333638
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Могун
>Вопрос как раз довольно внятный,...

Ага. Показывает недочеты при проектировании.

>...а править меня не надо...

Извини, я думал правлю твой пост. А тут вон что
:)

>Я и так хорош

Возможно. Не видел...
...
Рейтинг: 0 / 0
связь один ко многим
    #32333682
Yegoriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На самом деле - таблицы три - Person, Person_Education, Education_Type
так что на самом деле связь все таки один ко многим
...
Рейтинг: 0 / 0
связь один ко многим
    #32334221
Denis Uskov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Yegoriy
>На самом деле - таблицы три - Person, Person_Education, Education_Type
так что на самом деле связь все таки один ко многим

Так может все таки "много-ко-многим" ?

С уважением, Denis Uskov
...
Рейтинг: 0 / 0
связь один ко многим
    #32334839
Yegoriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Denis Uskov

Нет, связь один ко многим так как таблицы PERSON и PERSON_EDUCATION связаны по полю PERSON_ID в таблице PERSON информация о людях в таблице PERSON_EDUCATION информация об образовании т.е. что закончил, когда закончил, и т. п. одна запись из PERSON связана со многими из PERSON_EDUCATION. А уж потом таблица PERSON_EDUCATION связана с таблицей EDUCATION_TYPE по полю EDUCATION_TYPE_ID, в таблице EDUCATION_TYPE (по сути она справочник) хранятся типы образований которых кстати около 20-ти соответствуя ОКИН.
C уважением, Yegoriy
...
Рейтинг: 0 / 0
связь один ко многим
    #32342171
Andrey_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>Yegoriy
Всетаки связь между таблицами PERSON и EDUCATION многие-ко-многим организованая через э...промежуточную таблицу PERSON_EDUCATION.

Кстати начинать свой вопрос стоило с того что у вас 3 таблици а не 2.


Немного поправив Johnmen:

SELECT P.PERSON_ID
FROM PERSON P
WHERE

(EXISTS (SELECT * FROM PERSON_EDUCATION PE1, EDUCATION_TYPE ET1 WHERE
(P.PERSON_ID=PE1.PERSON_ID) AND
(PE1.EDUCATION_ID=ET1.EDUCATION_ID) AND
(ET1.EDUCATION='высшее')))
and
(EXISTS (SELECT * FROM PERSON_EDUCATION PE2, EDUCATION_TYPE ET2 WHERE
(P.PERSON_ID=PE2.PERSON_ID) AND
(PE2.EDUCATION_ID=ET2.EDUCATION_ID) AND
(ET2.EDUCATION='среднее')))
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / связь один ко многим
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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