![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запрос на объединение [D6, dBase, FoxPro]
V-A-V © (2006-05-18 07:39:00)Доброе всем время суток.
Народ подскажите как можно попороть ошибку?
Есть запрос на объединение, вот текст
Select 0 as SNGDR, 0 as SNGKR, Sum(Summa) as SDR, 0 as SKR
From MB_2006
Where ((Left(Account,2)="51") or (Left(Account,4)="51")) and
(Left(AccountK,2)<>"00") and (Data < {03/31/2006})
Union All
Select 0 as SNGDR, 0 as SNGKR, 0 as SDR, Sum(Summa) as SKR
From MB_2006
Where ((Left(AccountK,2)="51") or (Left(AccountK,4)="51")) and
(Left(Account,2)<>"00") and (Data < {03/31/2006})
По отдельности каждый из них отрабатывает отлично, а вот при объединении кидает ошибку:
Поставщик данных или другая служба вернули состояние E_FAIL
Как это бобороть ума не приложу!
sniknik (2006-05-18 13:18:00) [1]нда, не все кавычки убрал, уточнение
Select 0 as SNGDR, 0 as SNGKR, Sum(Summa) as SDR, Sum(0) as SKR
From mb_2006
Where Data < {04/20/2006} and Left(Account,2)="51" and Left(AccountK,2)<>"00"
Union All
Select 0, 0, 0, Sum(Summa)
From mb_2006
Where Data < {04/20/2006} and Left(AccountK,2)="51" and Left(Account,2)<>"00"
sniknik (2006-05-18 13:15:00) [2]> без Sum не работает!
тогда во втором запросе Sum у констант лишнее, если получается я прав, формат полей определяется первым запросом.
> значение 51 - это переменная длиной 2 или 4 цифири
обрезаные слева (Left) 2 символа, в любом случае дадут не больше 2 "цифирей".
говорю же, частный случай. или убери это обрезание, а т.к. это вычисление то убрав его заставиш индекс работать (если он есть).
равнозначный твоему запрос, должон работать, причем чуток быстрее
Select 0 as SNGDR, 0 as SNGKR, Sum(Summa) as SDR, Sum(0) as SKR
From mb_2006
Where Data < {04/20/2006} and (Left(Account,2)="51" and Left(AccountK,2)<>"00"
Union All
Select 0, 0, 0, Sum(Summa)
From mb_2006
Where Data < {04/20/2006} and Left(AccountK,2)="51") and Left(Account,2)<>"00"
V-A-V (2006-05-18 13:00:00) [3]> (Left(Account,2)="51") or (Left(Account,4)="51")
>предлагаю еще помедитировать над этой конструкцией... дополнительно, "до просветления"
не, не получится
значение 51 - это переменная длиной 2 или 4 цифири
V-A-V (2006-05-18 12:58:00) [4]без Sum не работает!
Johnmen (2006-05-18 12:37:00) [5]
> V-A-V © (18.05.06 12:00) [4]
А без Sum не работает?
sniknik (2006-05-18 12:09:00) [6]> (Left(Account,2)="51") or (Left(Account,4)="51")
предлагаю еще помедитировать над этой конструкцией... дополнительно, "до просветления"
V-A-V (2006-05-18 12:00:00) [7]Благодарю за помощь. Вот в таком виде все работает.
Select Sum(0.00) as SNGDR, Sum(0.00) as SNGKR, Sum(Summa) as SDR, Sum(0.00) as SKR
From mb_2006
Where (Data < {04/20/2006}) and
((Left(Account,2)="51") or (Left(Account,4)="51")) and
(Left(AccountK,2)<>"00")
Union All
Select Sum(0.00) as SNGDR, Sum(0.00) as SNGKR, Sum(0.00) as SDR, Sum(Summa) as SKR
From mb_2006
Where (Data < {04/20/2006}) and
((Left(AccountK,2)="51") or (Left(AccountK,4)="51")) and
(Left(Account,2)<>"00")
sniknik (2006-05-18 11:29:00) [8]> ((Left(Account,2)="51") or (Left(Account,4)="51"))
второе условие это частный случай первого (т.е. второе сдесь бессмысленно, раз есть проверка первого)
на Data есть индекс? поставь условие (Data < {03/31/2006}) первым, на всякий случай... остальные вычисляемые, индекс не используют даже если есть, т.е. если используемый sql движок "глупый", без анализа/плана выражения, то в этом случае по твоему будет полный скан таблици.
по ошибке: поставь в первом запросе вместо 0 например Sum(0) т.к. 0 константа и возможно поле получает признак "константности"/ридонли а у тебя после этому полю со второго рекордсета другая сумма "пристегивается".
Johnmen (2006-05-18 11:03:00) [9]Возможно, будет достаточно указывать 0.0вместо 0
ЮЮ (2006-05-18 10:54:00) [10]0 as SKR в первом запросе и Sum(Summa) as SKR во втором, естественно, разного типа. Приведи 0 к типу поля Summa