powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Help Помогите SQL написать
9 сообщений из 9, страница 1 из 1
Help Помогите SQL написать
    #32060085
vdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть работники и их родственники. Надо всех родственников перечислить в строке.
Код: 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.
drop table t1
create table t1 (auto_card int, full_name varchar( 50 ))
insert into t1 Values( 1111 ,'Иванов Иван Иванович')
insert into t1 Values( 2222 ,'Петров Петр Петрович')
insert into t1 Values( 3333 ,'Сидоров Сидор Сидорович')
drop table t2
create table t2 (auto_card int, full_name varchar( 50 ),rel_id int,date_birth datetime)
insert into t2 Values( 1111 ,'Иванова Елена Ивановна', 4 ,'1999-01-01')
insert into t2 Values( 1111 ,'Иванова Марина Ивановна', 4 ,'2001-01-01')
insert into t2 Values( 1111 ,'Иванова Светлана Сергеевна', 2 ,'1975-03-19')
insert into t2 Values( 2222 ,'Петров Максим Сидорович', 3 ,'2001-09-01')
drop table t3
create table t3 (rel_id int, name varchar( 50 ))
insert into t3 Values( 1 ,'муж')
insert into t3 Values( 2 ,'жена')
insert into t3 Values( 3 ,'сын')
insert into t3 Values( 4 ,'дочь')

 -- В принципе количество родственников и степеней родства может быть большe.
 
 -- Возможно ли это сделать не используя курсоров и временных таблиц т.е одним оператором Select?
 
 -- На выходе нужно получить следующее:
 
auto_card    full_name                                relat
 1111            Иванов Иван Иванович           жена Иванова Светлана Сергеевна год.рожд  1975 , дочь Иванова Елена Ивановна год.рожд  1999 , дочь Иванова Марина Ивановна год.рожд: 2001 
 2222            Петров Петр Петрович           сын Петров Максим Сидорович год.рожд  2001 
 3333            Сидоров Сидор Сидорович
...
Рейтинг: 0 / 0
Help Помогите SQL написать
    #32060091
ROMISH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А Вы можете конкатенацтию строк на стороне интерфейса сделать? Т.е. на сервере в хранимой процедуре делаете join этих таблиц, а уже на клиенте склеиваете те строки которые нужно.
...
Рейтинг: 0 / 0
Help Помогите SQL написать
    #32060095
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Help Помогите SQL написать
    #32060133
vdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрел FAQ, не хочется использовать Function и сложные операторы типа
update results set @Res=res=case when @ID=ID then Name+', '+@Res else Name end, @ID=ID
Хотелось бы составить один select, который запустился бы на клиенте и подготовил данные для отчета во временной таблице.
А если поставить ограничение на степени родства т.е. нужны только родственники с кодами 1,2,3,4 и select c подзапросами что-то типа:
select t1.full_name,
(select t3.name,t2.full_name,t2.date_birth
from t2,t3 where t2.auto_card=t1.auto_card and
t2.rel_id=t3.rel_id)
from t1
Дальше не хватает знаний. :(
...
Рейтинг: 0 / 0
Help Помогите SQL написать
    #32060250
OCLiker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SELECT Persons.FIO AS 'Персона', REL+' '+Rodst.FIO AS 'Родственники'
FROM RELS INNER JOIN Rodst ON Rodst.KODPERS = Persons.KOD INNER JOIN Persons ON RELS.KOD = Rodst.KODREL

И причём здесь сложные updates?
...
Рейтинг: 0 / 0
Help Помогите SQL написать
    #32060252
OCLiker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PS:

Если нужны не только персоны с родственниками - то ессно LEFT OUTER JOIN
...
Рейтинг: 0 / 0
Help Помогите SQL написать
    #32060289
OCLiker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сорри - запрос ваял в Access (по быстрому), а когда начал чистить - опечатался.
SELECT Persons.FIO AS 'Персона', REL+' '+Rodst.FIO AS 'Родственники'
FROM Persons INNER JOIN RELS ON RELS.KOD = Rodst.KODREL INNER JOIN Rodst ON Rodst.KODPERS = Persons.KOD
...
Рейтинг: 0 / 0
Help Помогите SQL написать
    #32060398
vdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to OCLiker
Select должен сгруппировать данные по всем родственникам для работников в одном поле и в одной строке (см.задание). А Ваш запрос будет для каждого родственника выдавать отдельную запись
...
Рейтинг: 0 / 0
Help Помогите SQL написать
    #32060480
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
set nocount on
create table #t1 (auto_card int, full_name varchar( 50 ))
insert into #t1 Values( 1111 ,'Иванов Иван Иванович')
insert into #t1 Values( 2222 ,'Петров Петр Петрович')
insert into #t1 Values( 3333 ,'Сидоров Сидор Сидорович')
create table #t2 (auto_card int, full_name varchar( 50 ),rel_id int,date_birth datetime)
insert into #t2 Values( 1111 ,'Иванова Елена Ивановна', 4 ,'1999-01-01')
insert into #t2 Values( 1111 ,'Иванова Марина Ивановна', 4 ,'2001-01-01')
insert into #t2 Values( 1111 ,'Иванова Светлана Сергеевна', 2 ,'1975-03-19')
insert into #t2 Values( 2222 ,'Петров Максим Сидорович', 3 ,'2001-09-01')
create table #t3 (rel_id int, name varchar( 50 ))
insert into #t3 Values( 1 ,'муж')
insert into #t3 Values( 2 ,'жена')
insert into #t3 Values( 3 ,'сын')
insert into #t3 Values( 4 ,'дочь')
create table #rep(id int identity( 1 , 1 ), auto_card int,relat varchar( 7000 ) default(''))
declare @str varchar( 8000 ),@id int
insert  #rep  (auto_card) select t.auto_card from #t1 t
select @id=(select max(id) from #rep)
while @id> 0 
begin
select @str=''
select @str=@str+ t3.name + ' '+t2.full_name + ' год.рожд '+cast(datepart(yyyy,t2.date_birth) as varchar( 4 ))+',' 
from #t2 t2 join #t3 t3 on t2.rel_id=t3.rel_id where t2.auto_card=(select auto_card from #rep where id=@id)
if len(@str)> 2  select @str=left(@str,len(@str)- 1 )
update #rep set relat=@str
where id=@id
select @id=@id- 1 
end
select t.*,r.relat from #t1 t join #rep r on t.auto_card=r.auto_card 
drop table #t1 drop table #t2 drop table #t3 drop table #rep
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Help Помогите SQL написать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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