powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Помогите решить задачу
10 сообщений из 10, страница 1 из 1
Помогите решить задачу
    #33143258
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть 2 таблицы

Table Docs
------------
DocID
...
FIO1
FIO2
FIO2


Table Lists
-----------
ID
DocID
FIO

смысл в следующем: есть документы и в них могут присутствовать максимум 3 фамилии (а могут и не быть - тогда фамилии должны быть в списке)
если их более 3х - они заносятся в список

Задача - надо выдать таблицу в которой бы были в каждой строчке по одному человеку и в этой же строчке параметры соответствующего ему документа

Я планирую сделать sp

Помогите пожалуйста с идеями и направлениями
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33144134
Goffman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему нельзя, чтобы фамилии были только в списке?
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33145278
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GoffmanА почему нельзя, чтобы фамилии были только в списке?

Потому что постановка задачи такая
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33145549
Goffman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spПотому что постановка задачи такая
Извини, я думал речь идет о проектировании ))
Я бы сделал с помощью union

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
create or replace view v_fio as
(select docid, fio
   from lists)
union
(select docid, fio1
   from docs
  where fio1 is not null)
union
(select docid, fio2
   from docs
  where fio2 is not null)
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33145596
jikez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем sp, можно и запросом одним обойтись

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
SELECT * FROM public."Docs"
DocID     FIO1     FIO2     FIO3     Name      
 --------  -------  -------  -------  --------- 
 1         Иванов   Сидоров  Петров   Проект №2 
 2         Тузов    (null)   (null)   Проект №1 
 3         Иванов   (null)   (null)   Проект №3 


SELECT * FROM public."List"
 ID     DocID     FIO    
 -----  --------  ------ 
 1      2         Перцев 
 2      2         Ручкин 
 3      2         Иванов 
 4      2         Петров


select q.*, "Docs"."Name" from (
    select "FIO1" as f, "DocID" as i from "Docs"
    union all
    select "FIO2" as f, "DocID" as i from "Docs"
    union all
    select "FIO3" as f, "DocID" as i from "Docs"
    union all
    select "FIO" as f, "DocID" as i from "List"
) q
join "Docs" on "DocID" = i
where q.f is not null
order by i

 f        i     Name      
 -------  ----  --------- 
 Иванов   1     Проект №2 
 Сидоров  1     Проект №2 
 Петров   1     Проект №2 
 Тузов    2     Проект №1 
 Перцев   2     Проект №1 
 Ручкин   2     Проект №1 
 Иванов   2     Проект №1 
 Петров   2     Проект №1 
 Иванов   3     Проект №3 
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33148066
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jikezЗачем sp, можно и запросом одним обойтись

Спасибо большое - такой запрос действительно выход из положения
У меня были идеи создания таблицы отчета и использовании триггеров для управления ей или использование sp c временной таблицей - но насколько я понимаю это был бы самый плохой вариант решения этой задаси

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
SELECT * FROM public."Docs"
DocID     FIO1     FIO2     FIO3     Name      
 --------  -------  -------  -------  --------- 
 1         Иванов   Сидоров  Петров   Проект №2 
 2         Тузов    (null)   (null)   Проект №1 
 3         Иванов   (null)   (null)   Проект №3 


SELECT * FROM public."List"
 ID     DocID     FIO    
 -----  --------  ------ 
 1      2         Перцев 
 2      2         Ручкин 
 3      2         Иванов 
 4      2         Петров


select q.*, "Docs"."Name" from (
    select "FIO1" as f, "DocID" as i from "Docs"
    union all
    select "FIO2" as f, "DocID" as i from "Docs"
    union all
    select "FIO3" as f, "DocID" as i from "Docs"
    union all
    select "FIO" as f, "DocID" as i from "List"
) q
join "Docs" on "DocID" = i
where q.f is not null
order by i

 f        i     Name      
 -------  ----  --------- 
 Иванов   1     Проект №2 
 Сидоров  1     Проект №2 
 Петров   1     Проект №2 
 Тузов    2     Проект №1 
 Перцев   2     Проект №1 
 Ручкин   2     Проект №1 
 Иванов   2     Проект №1 
 Петров   2     Проект №1 
 Иванов   3     Проект №3 
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33150543
jikez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще тут 2 момента
1. не понятно зачем такое надо
2. организация структуры таблиц - кто ж так догадался делать размещение полей с ФИО

тут однозначно нарашивается вариант хранить в табле List ссылки на справочник в фамилиями.
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33151623
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПотому что постановка задачи такаяА не пробовали уволить постановщика ? :) :) :)
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33157296
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LSV авторПотому что постановка задачи такаяА не пробовали уволить постановщика ? :) :) :)

на самом деле условие достаточно чложное и первый три лица в документе достаточно сильно связаны с документом
...
Рейтинг: 0 / 0
Помогите решить задачу
    #33157390
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jikezЗачем sp, можно и запросом одним обойтись

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select q.*, "Docs"."Name" from (
    select "FIO1" as f, "DocID" as i from "Docs"
    union all
    select "FIO2" as f, "DocID" as i from "Docs"
    union all
    select "FIO3" as f, "DocID" as i from "Docs"
    union all
    select "FIO" as f, "DocID" as i from "List"
) q
join "Docs" on "DocID" = i
where q.f is not null
order by i


Прошу прощения - я с синтаксисом ANSI SELECT никогда раньше не работал
Как мне в этот запрсос добавить курс из таблички курсов на указанную дату (с условием что указанная дата должна быть в диапазоне DateStart и DateFinish)

ExchangeRates
------------------
CurrencyID
Rate
DateStart
DateFinish

а в табличке Docs есть поле CurrencyID

Помогите пожалуйста!
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Помогите решить задачу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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