Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 В замешательстве...  [new]
Azvaal
Member

Откуда: Москва
Сообщений: 215
Прошу помощи, товарищи... Лето, душно. Мозг варится в черепной коробке...

select dt.DocNumber
      ,r.Brief
      ,r2.Brief as Brief_1
      ,'RUB' as Fund
      ,Qty1 = dt.Qty
      ,Qty2 = dt.FixQty
      ,dt.Comment
  from tDealTransact dt
      ,tResource r
      ,tResource r2
 where dt.Date       = @ArcDay
   and dt.Qty     >= @SumN
   and r.ResourceID  =  dt.ResourceID
   and substring(r.Brief,6,3) = '810'
   and r2.ResourceID =  dt.ResourcePsvID
   and substring(r2.Brief,6,3) = '810'
   and r.Brief not like '9\%'
union all
select dt.DocNumber
      ,r.Brief
      ,r2.Brief as Brief_1
      ,f.Brief as Fund
      ,Qty1 = dt.Qty
      ,Qty2 = dt.FixQty
      ,dt.Comment
  from tDealTransact dt
      ,tResource r
      ,tResource r2
      ,tFund f
 where dt.Date       = @ArcDay
   and dt.FixQty     >= @SumN
   and r.ResourceID  =  dt.ResourceID
   and substring(r.Brief,6,3) = '810'
   and r2.ResourceID =  dt.ResourcePsvID
   and substring(r2.Brief,6,3) <> '810'
   and r.Brief not like '9\%'
   and r2.FundID = f.FundID
union all
select dt.DocNumber
      ,r.Brief
      ,r2.Brief as Brief_1
      ,f.Brief as Fund
      ,Qty1 = dt.FixQty
      ,Qty2 = dt.Qty
      ,dt.Comment
  from tDealTransact dt
      ,tResource r
      ,tResource r2
      ,tFund f
 where dt.Date       = @ArcDay
   and dt.Qty        >= @SumN
   and r.ResourceID  =  dt.ResourceID
   and substring(r.Brief,6,3) <> '810'
   and r2.ResourceID =  dt.ResourcePsvID
   and substring(r2.Brief,6,3) = '810'
   and r.Brief not like '9\%'
   and r.FundID = f.FundID
union all
select dt.DocNumber
      ,r.Brief  
      ,r2.Brief as Brief_1
      ,'EUR' as Fund
      ,Qty1 = dt.Qty
      ,Qty2 = dt.Qty*c.Course
      ,dt.Comment
  from tDealTransact dt
      ,tResource r
      ,tResource r2
      ,pCourse   c
 where dt.Date       = @ArcDay
   and dt.Qty        >= 600000/c.Course
   and r.ResourceID  = dt.ResourceID
   and substring(r.Brief,6,3)  = '978'
   and r2.ResourceID = dt.ResourcePsvID
   and substring(r2.Brief,6,3) = '978'
   and r.Brief not like '9\%'
   and c.FundDest = 90001299
   and c.SPID = @@spid
union all
select dt.DocNumber
      ,r.Brief  
      ,r2.Brief as Brief_1
      ,'USD' as Fund
      ,Qty1 = dt.Qty
      ,Qty2 = dt.Qty*c.Course
      ,dt.Comment
  from tDealTransact dt
      ,tResource r
      ,tResource r2
      ,pCourse   c
 where dt.Date       = @ArcDay
   and dt.Qty        >= 600000/c.Course
   and r.ResourceID  = dt.ResourceID
   and substring(r.Brief,6,3)  = '840'
   and r2.ResourceID = dt.ResourcePsvID
   and substring(r2.Brief,6,3) = '840'
   and r.Brief not like '9\%'
   and c.FundDest = 1
   and c.SPID = @@spid

Надо как-то слить все это в один селект...

select @@version
Microsoft SQL Server  2000 - 8.00.2050 (Intel X86)   Mar  7 2008 21:29:56   Copyright (c) 1988-2003 Microsoft Corporation  Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2) 
9 июл 09, 09:15    [7394426]     Ответить | Цитировать Сообщить модератору
 Re: В замешательстве...  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
автор
Надо как-то слить все это в один селект...


А это разве не ОДНА инструкция?!
9 июл 09, 09:25    [7394453]     Ответить | Цитировать Сообщить модератору
 Re: В замешательстве...  [new]
Azvaal
Member

Откуда: Москва
Сообщений: 215
По большому счету можно привести все к одному виду. Я имею ввиду и там и тут будут таблицы pCourse и tFund

Но проблема в разделе "where" или "join", как кому удобнее...

логика вот такая: Есть операции, где корреспонденция "Вал-Вал","Вал-Руб","Руб-Вал","Руб-Руб"
И в зависимости от этого полям Qty1 & Qty2 присваиваются FixQty & Qty значения из таблицы tDealTransact
9 июл 09, 09:27    [7394460]     Ответить | Цитировать Сообщить модератору
 Re: В замешательстве...  [new]
Azvaal
Member

Откуда: Москва
Сообщений: 215
Проблема в том, что пользователь не хочет думать, анализ данных и составление ТЗ на уровне "И так сойдет".

Поэтому за 2 дня пришлось раз 10 дорабатывать запрос. Сейчас понадобилось ещё одно исключающее условие. Его придется добавлять во все 5 селектов. Гемморойно весьма, учитывая, что это возможно совсем не последняя просьба пользователя... Вот такая засада..
9 июл 09, 09:30    [7394470]     Ответить | Цитировать Сообщить модератору
 Re: В замешательстве...  [new]
Azvaal
Member

Откуда: Москва
Сообщений: 215
Еще, по задаче.
При корреспонденции "Вал-Руб" Qty-неприведенная сумма, FixQty-Приведенная. При обратной - соответственно.

При "Вал-Вал" приходится самому доставать курс и приводить Qty к рублевой сумме.
9 июл 09, 09:33    [7394479]     Ответить | Цитировать Сообщить модератору
 Re: В замешательстве...  [new]
Tosh
Member

Откуда: Vladivostok
Сообщений: 2956
Azvaal, как вариант - разные выборки внести в подзапрос, а общие условия прикрутить снаружи:
SELECT
  ...
FROM
  (
    SELECT
      ...
    FROM
      ...
    WHERE
      ...
    UNION
    SELECT
      ...
    FROM
      ...
    WHERE
      ...
  ) AS Q
WHERE
  ...
9 июл 09, 09:34    [7394480]     Ответить | Цитировать Сообщить модератору
 Re: В замешательстве...  [new]
Azvaal
Member

Откуда: Москва
Сообщений: 215
Tosh
Azvaal, как вариант - разные выборки внести в подзапрос, а общие условия прикрутить снаружи:
SELECT
  ...
FROM
  (
    SELECT
      ...
    FROM
      ...
    WHERE
      ...
    UNION
    SELECT
      ...
    FROM
      ...
    WHERE
      ...
  ) AS Q
WHERE
  ...


Да я так по сути и сделал... просто придется в каждый селест добавлять поле, с которым можно уже дальше работать. А если селекты добавятся? Или еще придется что-нить добавлять результат селекта... Вобщем просьба как раз в том, чтобы все обьеденить в один селект :)
9 июл 09, 09:39    [7394501]     Ответить | Цитировать Сообщить модератору
 Re: В замешательстве...  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
автор
Но проблема в разделе "where" или "join", как кому удобнее...


Для начала, я бы унес условия объединения во FROM.

автор
Проблема в том, что пользователь не хочет думать, анализ данных и составление ТЗ на уровне "И так сойдет".

Поэтому за 2 дня пришлось раз 10 дорабатывать запрос. Сейчас понадобилось ещё одно исключающее условие. Его придется добавлять во все 5 селектов. Гемморойно весьма, учитывая, что это возможно совсем не последняя просьба пользователя... Вот такая засада..


Проблемы организационного характера программными методами не решить.
9 июл 09, 09:41    [7394510]     Ответить | Цитировать Сообщить модератору
 Re: В замешательстве...  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Azvaal
Вобщем просьба как раз в том, чтобы все обьеденить в один селект :)


Еще раз. Сколько бы Вы не написали UNIONов или SELECT FROM (SELECT) - это будет "один SELECT". И далеко не факт, что запрос построенный в Вашем понимании "одного SELECTа" будет оптимальнее.
9 июл 09, 09:43    [7394523]     Ответить | Цитировать Сообщить модератору
 Re: В замешательстве...  [new]
Azvaal
Member

Откуда: Москва
Сообщений: 215
pkarklin,

Ну если так... Добавлю: переодически при исполнении отчета вылетает ошибка. Точно не скажу, какая, но суть в том, что транзакция умирает. Помню слово deadlock

Вот я и подумал, что она возникает из-за структуры моего запроса... Если это не так - всем спасибо за помощь, буду геммороиться :)
9 июл 09, 09:48    [7394552]     Ответить | Цитировать Сообщить модератору
 Re: В замешательстве...  [new]
Azvaal
Member

Откуда: Москва
Сообщений: 215
pkarklin
автор
Но проблема в разделе "where" или "join", как кому удобнее...

Для начала, я бы унес условия объединения во FROM.


Если вы про join - MS SQL 2000 позволяет такой синтаксис. С-ма, для которой все это пишу сама построена на sql запросах и все они через where. Большинство зашитых (дистрибутивных) отчетов также через where. Писать через join считаю плохим тоном )))))))))
9 июл 09, 09:51    [7394573]     Ответить | Цитировать Сообщить модератору
 Re: В замешательстве...  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Azvaal
pkarklin,

Ну если так... Добавлю: переодически при исполнении отчета вылетает ошибка. Точно не скажу, какая, но суть в том, что транзакция умирает. Помню слово deadlock

Вот я и подумал, что она возникает из-за структуры моего запроса... Если это не так - всем спасибо за помощь, буду геммороиться :)


Как бороться с метрвыми блокировками, описано в документации. Начать надо с анализа графа дедлока.
9 июл 09, 09:55    [7394591]     Ответить | Цитировать Сообщить модератору
 Re: В замешательстве...  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Azvaal
Если вы про join - MS SQL 2000 позволяет такой синтаксис.


А вот 2005 в режиме совместимости 90 уже нет.


Azvaal
С-ма, для которой все это пишу сама построена на sql запросах и все они через where. Большинство зашитых (дистрибутивных) отчетов также через where.


Это не показатель, и только "-" системе и ее разработчикам.

Azvaal
Писать через join считаю плохим тоном )))))))))


Раскажите это ANSI. ;)
9 июл 09, 09:57    [7394603]     Ответить | Цитировать Сообщить модератору
 Re: В замешательстве...  [new]
Azvaal
Member

Откуда: Москва
Сообщений: 215
pkarklin
Azvaal
pkarklin,

Ну если так... Добавлю: переодически при исполнении отчета вылетает ошибка. Точно не скажу, какая, но суть в том, что транзакция умирает. Помню слово deadlock

Вот я и подумал, что она возникает из-за структуры моего запроса... Если это не так - всем спасибо за помощь, буду геммороиться :)


Как бороться с метрвыми блокировками, описано в документации. Начать надо с анализа графа дедлока.


если можно поподробнее... Я не особо силен в SQL, а особенно в оптимизации :) Если можно - ссыль на МСДН :)
9 июл 09, 10:00    [7394629]     Ответить | Цитировать Сообщить модератору
 Re: В замешательстве...  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Azvaal
если можно поподробнее... Я не особо силен в SQL, а особенно в оптимизации :) Если можно - ссыль на МСДН :)



http://support.microsoft.com/kb/832524
9 июл 09, 10:03    [7394646]     Ответить | Цитировать Сообщить модератору
 Re: В замешательстве...  [new]
Azvaal
Member

Откуда: Москва
Сообщений: 215
pkarklin,

бООООльшое спасибо :) Тема закрыта.
9 июл 09, 10:04    [7394655]     Ответить | Цитировать Сообщить модератору
 Re: В замешательстве...  [new]
igorekk
Member

Откуда: Москва
Сообщений: 316
Этот код будет выполняться в отчёте для Диасофта? Если да, то надо проставить хинты через #M_NOLOCK_INDEX.

PS. Смотри 600thousand.tpr
9 июл 09, 11:19    [7395194]     Ответить | Цитировать Сообщить модератору
 Re: В замешательстве...  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
igorekk
Этот код будет выполняться в отчёте для Диасофта?


ГЫ... Тогда понятно, откуда:

автор
С-ма, для которой все это пишу сама построена на sql запросах и все они через where. Большинство зашитых (дистрибутивных) отчетов также через where.


9 июл 09, 11:21    [7395220]     Ответить | Цитировать Сообщить модератору
 Re: В замешательстве...  [new]
igorekk
Member

Откуда: Москва
Сообщений: 316
pkarklin, :)

автор, tFund тут не нужен. Да и вообще это вьюха, а не таблица.
9 июл 09, 11:31    [7395311]     Ответить | Цитировать Сообщить модератору
 Re: В замешательстве...  [new]
Azvaal
Member

Откуда: Москва
Сообщений: 215
igorekk,

Хм. Как это не нужен, откуда же мне достать название валюты?
13 июл 09, 11:28    [7407375]     Ответить | Цитировать Сообщить модератору
 Re: В замешательстве...  [new]
Ох...ий программизд
Guest
Azvaal
Писать через join считаю плохим тоном

Оригинально...
14 июл 09, 11:32    [7412351]     Ответить | Цитировать Сообщить модератору
 Re: В замешательстве...  [new]
Azvaal
Member

Откуда: Москва
Сообщений: 215
Ох...ий программизд,

Я это говорю в контексте работы на Diasoft 5NT
14 июл 09, 12:12    [7412620]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить