Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите составить SQL запрос [MSSQL]


Страницы:   1 2

Max Zyuzin ©   (2005-08-31 12:40:00) 

Если конечно такой вообще можно составить.
Есть 2 таблицы master-detail (Отношение один к многим)
MasterTable имеет поля к примеру MId (PK), MField1, MField2 ...
DetailTable имеет поля - MasterId (FK), DField1, DField2 ...

Хочкется получить такую выборку данных из двух таблиц...

|MId | MField1 | Mfield2 | "DField1, DField1"  | ....
То, есть через запятую, к примеру, перечислены все значения из таблицы Detail у которых MasterId = Mid...
Вот как это реализовать можно?

Что то мне подсказывает что такое реализовать можно только через SP ???


Max Zyuzin   (2005-08-31 16:36:00) [21]

В общем сделал вот что


create function GetFiltersValue(@RequestNumber bigint, @RequestDate Datetime)
returns varchar(8000)
as
begin
  declare @FieldValue varchar(8000)
  set @FieldValue = ''
  declare @CurVal varchar(1000)
  declare curShipFilter cursor local static read_only for
    Select distinct SRF.DispatchStation from ShpRequestFilterView SRF
    where SRF.srfRequestNumber = @RequestNumber and SRF.srfRequestDate = @RequestDate
  open curShipFilter;
  while @@fetch_status = 0
  begin
   fetch next from curShipFilter into @CurVal
   Set @FieldValue = @FieldValue + IsNULL(@CurVal,'')
  end
  return @FieldValue
end

select dbo.GetFiltersValue(srRequestNumber,srCrDate), * from ShipmentRequestView

Все запускается и если раньше стабильно NULL приезжал то сейчас приезжает стабильно '' Типа не NULL уже, но тоже не много...
Мало того результат тот же если убрать строку

where SRF.srfRequestNumber = @RequestNumber and SRF.srfRequestDate = @RequestDate

Т.е. по идее должно вообще все возвращаться... возвващается фиг... почему?


Ega23   (2005-08-31 16:32:00) [22]

AFAIK, функции только с 2000 появились.
По крайней мере, у нас существенная часть заказчиков ещё семёркой пользуется. Поэтому при написании скриптов от функций приходится отказываться...


ANB   (2005-08-31 16:27:00) [23]


> Ega23 ©   (31.08.05 15:58) [9]
- а разве 7 не ест функции ?


Max Zyuzin   (2005-08-31 16:27:00) [24]

Доправился вот до такого кода


create function GetFiltersValue(@RequestNumber bigint, @RequestDate Datetime)
returns varchar(8000)
as
begin
  declare @FieldValue varchar(8000)
  declare @CurVal varchar(1000)
  declare curShipFilter cursor local static read_only for
    Select distinct SRF.DispatchStation from ShpRequestFilterView SRF
    where SRF.srfRequestNumber = @RequestNumber and SRF.srfRequestDate = @RequestDate
  open curShipFilter;
  while @@fetch_status = 0
  begin
   fetch next from curShipFilter into @CurVal
   Set @FieldValue = @FieldValue + IsNULL(@CurVal,'')
  end
  return @FieldValue
end

select GetFiltersValue(srRequestNumber,srCrDate), * from ShipmentRequestView



Все то же выдает что функции такой нету :(


Max Zyuzin   (2005-08-31 16:19:00) [25]

Поправил на функцию... пока тоже в кучу все свалил

create function GetFiltersValue()
returns varchar(8000)
as
begin
  declare @FieldValue varchar(8000)
  declare @CurVal varchar(1000)
  declare curShipFilter cursor local static read_only for
    Select distinct DispatchStation from ShpRequestFilterView
  open curShipFilter;
  while @@fetch_status = 0
  begin
   fetch next from curShipFilter into @CurVal
   Set @FieldValue = @FieldValue + IsNULL(@CurVal,'')
  end
  return @FieldValue
end

Получаю на select GetFiltersValue()сообщение что
'GetFiltersValue' is not a recognized function name.
К чему бы это?


Max Zyuzin   (2005-08-31 16:01:00) [26]

>ANB ©   (31.08.05 15:53) [7]
Ага... я вообще то как раз и хотел написать функцию.... ща поправим...


Ega23   (2005-08-31 16:00:00) [27]

2 Max Zyuzin ©   (31.08.05 15:56) [8]
Не то поменял. Измени
Set @FieldValue = @FieldValue + @CurVal
на
Set @FieldValue = @FieldValue + IsNull(@CurVal,'')


Ega23   (2005-08-31 15:58:00) [28]

2 Max Zyuzin ©   (31.08.05 15:48) [5]

кстати, а нафига ты SP создаёшь, а потом грохаешь? Я тебе пример написал, который сам по сеье будет работать. В Query можно запихать и через Open открыть...

2 ANB ©   (31.08.05 15:53) [7]

На MS SQL 7.0 не прокатит.


Max Zyuzin   (2005-08-31 15:56:00) [29]

>ANB ©   (31.08.05 15:52) [6]
Поменял в ХП строку с текстом запроса на вот такую
Select distinct coalesce(DispatchStation,' ') from ShpRequestFilterView
Результат тот же... NULL


ANB   (2005-08-31 15:53:00) [30]


> Max Zyuzin ©   (31.08.05 15:48) [5]
- кстати, лучше напиши функцию, ее можно потом будет просто в запрос запихать. Я так и делал.


ANB   (2005-08-31 15:52:00) [31]


> Max Zyuzin ©   (31.08.05 15:48) [5]
строка + Null = Null. IsNull поможет.


Max Zyuzin   (2005-08-31 15:48:00) [32]

Проба пера...

create procedure GetFiltersValue
  @FieldValue varchar(8000) = NULL output
as
  declare @CurVal varchar(1000)
  declare curShipFilter cursor local static read_only for
    Select distinct DispatchStation from ShpRequestFilterView
  open curShipFilter;
  while @@FETCH_STATUS = 0
  begin
  fetch next from curShipFilter into @CurVal
  Set @FieldValue = @FieldValue + @CurVal
  end
go

declare @s varchar(8000)
Exec GetFiltersValue @s
select @s

drop procedure GetFiltersValue

Решил пока все в кучу свалить, но результатом получаю NULL
Хотя запрос
Select distinct DispatchStation from ShpRequestFilterView
Возвращает некоторый набор данных, правда в нем есть и NULL может здесь закопана собака?


Ega23   (2005-08-31 14:34:00) [33]

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

А, ну это фигня. Надо ещё один курсор ввести, только и всего.
После
if @@fetch_status <> 0 BREAK;    
вставляешь следующий код:

Declare CurDetail cursor local static for
 Select DField from DetailTable where MasterID=@MID;
Open CurDetails;
While 0 = 0
begin
 fetch next from CurMaster into  @ss2;
 if @@fetch_status <> 0 BREAK;      
 Set @ss=@ss + @ss2;
end;
Close CurDetails;
Deallocate CurDetails;


Ну и @ss2 надо объявить, конечно...


Max Zyuzin   (2005-08-31 14:12:00) [34]

>Ega23 ©   (31.08.05 13:00) [2]
Спасибо за направление, но это не совсем так, как мне надо, надо в одно поле было собрать все значения одного и того же поля в подчиненной таблице... Еще раз спасибо, буду читать книги умные как курсорами пользоваться...

>stone ©   (31.08.05 12:49) [1]
Спасибо, пошел читать


Ega23   (2005-08-31 13:00:00) [35]


Set NoCount ON
Declare @MId int, @ss varchar(8000);

Create Table #tmp
(
  MId int,
  MField1 int,
  MField2,
  DetailFldStr varchar(8000) null
);

Insert into #tmp (MId, MField1, MField2)
  Select MId, MField1, MField2 from MasterTable;
Declare CurMaster cursor local static for
 Select MId from MasterTable;
Open Cur;
While 0 = 0
 begin
  fetch next from CurMaster into  @MId;
  if @@fetch_status <> 0 BREAK;              
  Select @ss=DField1+','+DField2+','+...
        from  DetailTable
        where MasterID=@Mid;
  Update #tmp Set DetailFldStr=@ss where MId=@Mid;
 end;
Close CurMaster;
Deallocate CurMaster;

Set NoCount OFF;
Select * from #tmp;
Drop Table #tmp;


Вроде так...


stone   (2005-08-31 12:49:00) [36]


> Что то мне подсказывает что такое реализовать можно только
> через SP ???

Интуиция? Правильно подсказывает, т.к. без курсоров тут не обойтись.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо