![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите составить SQL запрос [MSSQL]
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
Получаю на selectGetFiltersValue()сообщение что
'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 ???
Интуиция? Правильно подсказывает, т.к. без курсоров тут не обойтись.