![]() |
| ||
|
|
Новости |
Поиск |
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-09-01 09:20:00) [1]>ANB © (31.08.05 17:55) [35]
Дык а чего писать добавил еще один параметр к функции и по разным условиям прописал разное объявление курсора (разные точнее запросы) и все заработало.
ANB (2005-08-31 17:55:00) [2]
> Max Zyuzin © (31.08.05 17:52) [34]
- напиши потом, чего получилось.
Max Zyuzin (2005-08-31 17:52:00) [3]>Ega23 © (31.08.05 17:35) [32]
Мне в общем то надо вполне конечное число полей... к тому же в том View из которого я выбираю их тоже конечно число... вполне устраивает, ИМХО лучше чем цать отдельных функций...
Ega23 (2005-08-31 17:36:00) [4]2 ANB © (31.08.05 17:27) [29]
- халтурщики. Требуется, не требуется. Оракл рулит.
А я и не спорю, что TSQL - "птичий" язык. Но другого-то пока нет...
Ega23 (2005-08-31 17:35:00) [5]Пока ходил кофе пить сам додумался до Case :) ща буду реализовывать. Сенкс
Ну это только для ограниченного и вполне конкретного набора полей. Если устраивает - то самый простой вариант.
Ega23 (2005-08-31 17:34:00) [6]Так с ходу не придумывается...
А тебе всенепременно надо функцией?
Max Zyuzin (2005-08-31 17:29:00) [7]>ANB © (31.08.05 17:27) [29]
Пока ходил кофе пить сам додумался до Case :) ща буду реализовывать. Сенкс
ANB (2005-08-31 17:27:00) [8]
> Ega23 © (31.08.05 16:53) [23]
- халтурщики. Требуется, не требуется. Оракл рулит.
> Max Zyuzin © (31.08.05 17:20) [28]
- если у тебя ограниченный состав полей, то лучше написать case в запросе для курсора. Динамический SQL в T-SQL по сравнению с PL/SQL отстойный, хотя и в PL/SQL им лучше не злоупотреблять без причины.
Max Zyuzin (2005-08-31 17:20:00) [9]>Ega23 © (31.08.05 17:11) [27]
Это понятно... написал ибо думал что там запрос будет сложнее. у меня вообще есть привычка именовать поля таким образом, что бы они не повторялись вообще во все базе данных, обычно добавляя сокращения названия таблицы в начало типа srfRequestNumber (первые 3-и маленьких буквы- сокращение ShipmentRequestFilter)
возникло у меня еще одно безумное желание :)
Вот так у меня теперь выглядит функция
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
fetch first from curShipFilter into @CurVal
while @@fetch_status = 0
begin
Set @FieldValue = @FieldValue + IsNULL(@CurVal,'')
fetch next from curShipFilter into @CurVal
if @@fetch_status = 0 Set @FieldValue = @FieldValue + ','
end
Close curShipFilter
Deallocate curShipFilter
return @FieldValue
end
Хочется значение столбца, по которому будем вести отбор в данном случае DispatchStation передавать в качестве параметра, ибо таких столбцов мне надо несколько... а для каждого ваять такую же функцию не хоцца... почитал пример вот тут...
http://www.sql.ru/faq/faq_topic.aspx?fid=104
Но пока нифига не понял, как это равлизовать.
Ega23 (2005-08-31 17:11:00) [10]2 Max Zyuzin © (31.08.05 17:07) [26]
Ещё одно замечание. Даже не замечание, а, скорее, ремарка:
Select distinct SRF.DispatchStation from ShpRequestFilterView SRF
where SRF.srfRequestNumber = @RequestNumber and SRF.srfRequestDate = @RequestDate
В случае обращения к одной таблице префикс SRF можно не использовать.
Max Zyuzin (2005-08-31 17:07:00) [11]>Ega23 © (31.08.05 17:04) [25]
Я и так пробовал... только я сначала видать проверку ставил, а потом фетчил... спасибо, с меня пиво :) обоим
Ega23 (2005-08-31 17:04:00) [12]2 Max Zyuzin © (31.08.05 17:00) [24]
В обчем почитал BOL и в общем проблемма решалась путем добавления строки
fetch first from curShipFilter into @CurVal
После открытия курсора...
И усе забегало.
Только хотел написать...
Обрати внимание, как я первый раз тебе пример с курсором показал:
while (0=0)
begin
Fetch Next ....
if @@FETCH_STATUS=0 then Break
end
Max Zyuzin (2005-08-31 17:00:00) [13]В обчем почитал BOL и в общем проблемма решалась путем добавления строки
fetch first from curShipFilter into @CurVal
После открытия курсора...
И усе забегало.
Ega23 (2005-08-31 16:53:00) [14]2 ANB © (31.08.05 16:46) [21]
- очень желательно, но ошибка тут не из-за этого.
2 Max Zyuzin © (31.08.05 16:48) [22]
Результат тот же.
Да это и не может быть решением проблемы. Просто коль выделил память под курсор и открыл его, то будь любезен закрыть и освободить память. Ошибка, конечно, не из-за этого...
2 ANB © (31.08.05 16:43) [20]
- а зачем тут точка с запятой ?
Логическое разграничение операций. В принципе, на TSQL - не требуется. С учётом того, что кроме TSQL ещё пишу на delphi, иногда на С++ и в свободное время играюсь с FireBird, где разделитель обязателен - просто привычка. Смотреть текст удобнее.
Max Zyuzin (2005-08-31 16:48:00) [15]Дабавил вот такую штуку... короче '1' никогда не возвращается типа в цикл не заходит оно никогда
open curShipFilter;
while @@fetch_status = 0
begin
fetch next from curShipFilter into @CurVal
Set @FieldValue = @FieldValue + '1' + IsNULL(@CurVal,'')
end
>Ega23 © (31.08.05 16:40) [18]
Результат тот же.
ANB (2005-08-31 16:46:00) [16]
> Ega23 © (31.08.05 16:40) [18]
- очень желательно, но ошибка тут не из-за этого.
> Max Zyuzin © (31.08.05 16:36) [16]
- сконопать пример цикла по курсору из BOL, отладь его отдельно с принтом, потом засунь в функцию. В функции тоже оставь принты в цикле. Так потихоньку и найдешь ошибку.
ANB (2005-08-31 16:43:00) [17]
> open curShipFilter;
- а зачем тут точка с запятой ?
Жмуткий язык T-SQL. PL/SQL намного удобнее.
Ega23 (2005-08-31 16:42:00) [18]2 ANB © (31.08.05 16:39) [17]
Может Ega23 чего подскажет, у него сервер под рукой и знает больше.
Не, по функциям - не скажу. Не делал никогда. Еднственное, что могу посоветовать - BOL.
Ega23 (2005-08-31 16:40:00) [19]2 Max Zyuzin © (31.08.05 16:36) [16]
Перед return @FieldValue надо вставить
Close curShipFilter
Deallocate curShipFilter
ANB (2005-08-31 16:39:00) [20]
> Ega23 © (31.08.05 16:32) [15]
- странно. Давненько я MS SQL не юзал. Да и последний раз 2000.
> Max Zyuzin © (31.08.05 16:27) [13]
- нарывался я на похожую проблему, только с процедурой. Уже не помню, чего было. То ли ошибка в синтаксисе, то ли как то функцию похитрее надо было объявлять. А она в списке функций появляется ? Может Ega23 чего подскажет, у него сервер под рукой и знает больше.