Некрасиво...

Azvaal
Дата: 26.02.2010 14:35:49
Есть вот такого вида кусок кода:

select a.Value
  from tAccrualDetail a
 where a.DealProtocolID = 2010018982193
   and a.Value <> 0
   and a.Date = (select min(a1.Date)
                   from tAccrualDetail a1
                  where a1.DealProtocolID = 2010018982193
                    and a1.Value <> 0)
можно ли написать его оптимальнее, красивее что ли :)
Гавриленко Сергей Алексеевич
Дата: 26.02.2010 14:38:05
select top 1 a.Value
  from tAccrualDetail a
 where a.DealProtocolID = 2010018982193
   and a.Value <> 0
order by a.Date
Glory
Дата: 26.02.2010 14:38:15
select top 1 a.Value
from tAccrualDetail a
where a.DealProtocolID = 2010018982193
and a.Value <> 0
order by a.Date desc
Azvaal
Дата: 26.02.2010 14:40:55
Придется добавить, что этот кусок пойдет в большой селект, Айдишник в явном виде заменится чем-то вроде #DEAL_PROT.ID и сортировка, само собой не вариант :)
Гавриленко Сергей Алексеевич
Дата: 26.02.2010 14:42:06
Azvaal
Придется добавить, что этот кусок пойдет в большой селект, Айдишник в явном виде заменится чем-то вроде #DEAL_PROT.ID и сортировка, само собой не вариант :)
Что там произойдет с айдишником, я так и непонял. И почему сортировка не вариант - тоже.
Azvaal
Дата: 26.02.2010 14:49:50
[/SRC][src]select NachisID       = #DEAL_PROT.NACH_ID
      ,DealProtocolID = #DEAL_PROT.ID
      ,DateProtocol   = #DEAL_PROT.DATE
      ,BranchID       = op.InstitutionID
      ,OperationID    = op.OperationID
      ,DealID         = dt.DealID
      ,TaxVid         = case 
                          when #DOC_GROUP.BRIEF = @BRIEF_PTAX 
                          then 'Подоходный' 
                          else '' 
                        end
      ,TaxAmt         = case 
                          when #DOC_GROUP.BRIEF = @BRIEF_PTAX 
                          then op.Qty 
                          else $0 
                        end
      ,AccDebID       = op.ResourceID
      ,AccCreID       = op2.ResourceID
      ,Qty            = case 
                          when op.FundID = d.FundID 
                          then op.Qty 
                          else op2.Qty 
                        end
      ,QtyBs          = op.QtyBs
      ,IsRUR          = case 
                          when d.FundID = @RUR then 1 
                          else 0 
                        end
      ,IsItog         = #DOC_GROUP.IS_ITOG
      ,BriefType      = #DOC_GROUP.Brief 
  from #DEAL_PROT
      ,tDealTransact dt
      ,#DOC_GROUP
      ,tDocMark      m41
      ,tOperPart     op
      ,tDeal         d
      ,tOperPart     op2
      ,tResource     r
      ,tResource     r2
 where dt.DealProtocolID    = #DEAL_PROT.ID
   and #DOC_GROUP.ID        = dt.AccAnlID
   and m41.SPID             = @@spid
   and m41.Type             = 41
   and m41.ID               = dt.InstitutionID
   and op.DealTransactID    = dt.DealTransactID
   and op.CharType          = 1
--   and op.AccountingType&1  = 1
   and op.AccountingType  = 1

   and op.Confirmed        <= 1
   and op.Confirmed        >= @Confirmed
   and d.DealID             = dt.DealID
   and op2.OperationID      = op.OperationID
   and op2.CharType         = (-1) * op.CharType
   and op2.AccountingType&1 = 1
   and r.ResourceID         = op.ResourceID 
   and r2.ResourceID        = op2.ResourceID

В селект надо добавить поле:
a.Value as Basic
с помощью интеграции скрипта:
select a.Value
  from tAccrualDetail a
 where a.DealProtocolID = 2010018982193
   and a.Value <> 0
   and a.Date = (select min(a1.Date)
                   from tAccrualDetail a1
                  where a1.DealProtocolID = 2010018982193
                    and a1.Value <> 0)
где 2010018982193 - это одно из значения поля
ID
из таблицы
#DEAL_PROT

p.s.

from #DEAL_PROT
where dt.DealProtocolID    = #DEAL_PROT.ID
msLex
Дата: 26.02.2010 14:50:41
Гавриленко Сергей Алексеевич
select top 1 a.Value
  from tAccrualDetail a
 where a.DealProtocolID = 2010018982193
   and a.Value <> 0
order by a.Date


А разве это эквивалентные запросы?


исходный может вернуть несколько записей с одинаковыми датами.
Azvaal
Дата: 26.02.2010 14:50:52
Ну или чтобы красиво было
Basic = a.Value
Azvaal
Дата: 26.02.2010 14:51:50
msLex
Гавриленко Сергей Алексеевич
select top 1 a.Value
  from tAccrualDetail a
 where a.DealProtocolID = 2010018982193
   and a.Value <> 0
order by a.Date


А разве это эквивалентные запросы?


исходный может вернуть несколько записей с одинаковыми датами.


не может, так как написано
top 1
msLex
Дата: 26.02.2010 14:52:58
Azvaal
msLex
Гавриленко Сергей Алексеевич
select top 1 a.Value
  from tAccrualDetail a
 where a.DealProtocolID = 2010018982193
   and a.Value <> 0
order by a.Date


А разве это эквивалентные запросы?


исходный может вернуть несколько записей с одинаковыми датами.


не может, так как написано
top 1

где в исходном запросе top 1???