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-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 чего подскажет, у него сервер под рукой и знает больше.


Страницы:   1 2

Наверх

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