|
SQL для отчета если есть связи 1:N
|
|||
---|---|---|---|
#18+
вопрос, есть ситуация таблица EMP имеются связи 1:N c таблицами LANG & CERT те если я хочу выбрать данные одним запросом то получаю в результате декартово произведение таблицы LANG и CERT как лучше подойти к построению отчета с такими данными , выбирать несколькими запросами , или еще както ? PS (может у кого естьссылки где описываються подобные вопросы и ответы ? ) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2003, 12:22 |
|
SQL для отчета если есть связи 1:N
|
|||
---|---|---|---|
#18+
Что нужно получить и какова структура таблиц? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2003, 14:43 |
|
SQL для отчета если есть связи 1:N
|
|||
---|---|---|---|
#18+
мне надо в отчете для каждой записи из таблицы EMP вывести ссылающиеся на него записи из LANG и ссылающиеся на него записи из CERT create table EMP ( EMP_SysNo GSYSNO not null, EMP_ClockNo int not null, constraint PK_EMP primary key (EMP_SysNo) ) create table LANG ( LANG_SysNo numeric(18) not null, LANG_EMPRef CODERFR not null, LANG_No smallint not null, LANG_LangRFR SH_RFR not null, LANG_GradeFlagRFR IFLAG not null, constraint PK_LANG primary key (LANG_SysNo), constraint AK_LANG_AK_LANG unique (LANG_EMPRef, LANG_No) ) create table CERT ( CERT_SysNo GSYSNO not null, CERT_EMPRef CODERFR not null, CERT_Type SH_RFR not null, CERT_EducForm_FlagRFR IFLAG not null, CERT_BDate IRBIS_DATE null, CERT_EDate IRBIS_DATE null, CERT_IssueDate IRBIS_DATE null, CERT_ProfessRFR SH_RFR not null, CERT_Class_FlagRFR IFLAG not null, CERT_IdNo STR35 null, CERT_Issuer LONG_DESC not null, CERT_EducRFR SH_RFR not null, CERT_AcrdLevel smallint null, CERT_Qualification STR70 not null, CERT_Course smallint null, CERT_SpecialityDiploma LONG_DESC null, CERT_DirecTrain LONG_DESC null, CERT_Amount VAL null, CERT_isBasic ILOGF not null, CERT_EMPTEAAssc CODERFR null, constraint PK_CERT primary key (CERT_SysNo) ) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2003, 15:08 |
|
SQL для отчета если есть связи 1:N
|
|||
---|---|---|---|
#18+
Извини, совсем запутался. Задам вопросы последовательно: 1. В результирующей таблице все записи из подчиненных таблиц (LANG, CERT) должны ссылаться на EMP (если так, то в чем смысл подобного объединения?) или последовательно , например CERT->LANG->EMP (в таком случае конечно все просто: select * from EMP e,CERT c,LANG l where e.EMP_SysNo = l.LANG_SysNo and l.LANG_SysNo = c.CERT_SysNo and ...) ? 2. Нужно, чтобы в одной строке результирующей таблицы были поля всех трех исходных (EMP.*,LANG.*,CERT.*) ? 3. Связь нужна *= или = ? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2003, 20:55 |
|
SQL для отчета если есть связи 1:N
|
|||
---|---|---|---|
#18+
смысл этих таблиц есть человек - EMP он знает несколько языков - EMP left join LANG on LANG_EMPRef = EMP_SysNo он имеет несколько сертификатов - EMP left join CERT on CERT_EMPRef = EMP_SysNo надо отчет вида 1 ... Иванов........английский............................. техникум .........................русский..................................школа .........................украинский.............................институт 2.....Петров .... если написать FROM EMP left join LANG on LANG_EMPRef = EMP_SysNo left join CERT on CERT_EMPRef = EMP_SysNo получаю декартово произведение строк из таблицы CERT на LANG наверное же уже есть какойто устоявшийся подход к формированию такого рода отчетов ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2003, 11:05 |
|
SQL для отчета если есть связи 1:N
|
|||
---|---|---|---|
#18+
>FROM EMP left join LANG on LANG_EMPRef = EMP_SysNo >left join CERT on CERT_EMPRef = EMP_SysNo >получаю декартово произведение строк из таблицы CERT на LANG Совершенно справедливо, ведь таблицы LANG и CERT в таком запросе не связаны. >надо отчет вида >1 ... Иванов........английский............................. техникум >.........................русский..................................школа >.........................украинский.............................институт Из этого отчета следует, что Иванов изучал английский в техникуме, русский в школе и т.д. или что-то другое? Для нормального запроса нужно, что бы все участвыющие в нем таблицы были логически связаны. Какова связь между LANG и CERT? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2003, 20:26 |
|
SQL для отчета если есть связи 1:N
|
|||
---|---|---|---|
#18+
в том то и дело что никакой и этого запроса следует что человек английский , русский и украинский а учился он в школе, техникуме и институте, те это два набора дополнительных данных, и которые связаны только тем что описывают одного и того же человека ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2003, 11:47 |
|
SQL для отчета если есть связи 1:N
|
|||
---|---|---|---|
#18+
Все-таки почему именно одним запросом? >те это два набора дополнительных данных, >и которые связаны только тем что описывают одного и того же человека Так и зачем их выводить вместе? Объединение несвязанных таблиц и дает декартово произведение. С помощью union и подобных ухищрений можно получить вывод вида: .......Иванов........английский..............................NULL .......Иванов........русский..................................NULL .......Иванов........украинский.............................NULL .......Иванов........NULL......................................техникум .......Иванов........NULL......................................школа .......Иванов........NULL......................................институт но только для одной записи из таблицы EMP, иначе будет что-то типа .......Иванов........английский..............................NULL .......Иванов........русский..................................NULL .......Иванов........украинский.............................NULL .......Петров........китайский...............................NULL .......Петров........малайский...............................NULL .......Иванов........NULL......................................техникум .......Иванов........NULL......................................школа .......Иванов........NULL......................................институт ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2003, 17:49 |
|
SQL для отчета если есть связи 1:N
|
|||
---|---|---|---|
#18+
юнион конечно хорошо, только что белать когда колво и типы полей из этих дополнительных таблиц не совпадают ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2003, 18:20 |
|
SQL для отчета если есть связи 1:N
|
|||
---|---|---|---|
#18+
Имелось в виду, что надо склеивать все таблицы, соответственно в первой части все поля CERT будут пустые, во второй у LANG. Еще раз - объединять эти данные в одном запросе нет смысла, любой генератор отчетов обработает ситуацию с двуми подчиненными наборами данных. Если генеришь отчет сам, придется делать два запроса и выдергивать данные из них. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2003, 10:44 |
|
|
start [/forum/topic.php?fid=55&msg=32175217&tid=2014902]: |
0ms |
get settings: |
10ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
43ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
others: | 238ms |
total: | 391ms |
0 / 0 |