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

Откуда:
Сообщений: 7
Добрый день!

Странное дело, господа!

Мой запрос прекрасно работает с 1 джойном, но категорически не работает с 2-мя и более!!

Подскажите начинающему в чем может быть ошибка?

Спасибо!

select * into #cc from CRM_Claims where DateReg > dateadd(day, -10, getdate())
go
select
	cc.DateReg
	,ss.status
	,gg.Gradient
	,tt.ClaimType
from #cc cc
-- Выборка статуса обращения из ReferenceBooks
		join (select cast(_s.[value] as int) as value, _s.rus_name as [Status] from ReferenceBooks _s
				join ReferenceBooks _ss on _ss.id = _s.parent_id and _ss.owner_id = _s.parent_owner_id
				where _ss.value='CRM_Claims.Status'
		) ss on ss.value = cc.status
-- Выборка классификатора обращения из ReferenceBooks
		join (select cast(_g.[value] as int) as value, _g.rus_name as Gradient from ReferenceBooks _g
				join ReferenceBooks _gg on _gg.id = _g.parent_id and _gg.owner_id = _g.parent_owner_id
				where _gg.value='CRM_Claims.Gradient'
		) gg on gg.value = cc.gradient
-- Выборка типа обращения из ReferenceBooks
		join (
			select cast(.[value] as int) as value, _r.rus_name as ClaimType from ReferenceBooks _r
				join ReferenceBooks _rr on _rr.id = _r.parent_id and _rr.owner_id = _r.parent_owner_id
				where _rr.value='CRM_Claims.ClaimType'
		) tt on tt.value = cc.claimtype

order by datereg

drop table #cc
11 июн 13, 14:28    [14420749]     Ответить | Цитировать Сообщить модератору
 Re: 1 Джойн работает, 2 и более нет  [new]
Glory
Member

Откуда:
Сообщений: 104751
timaxi
но категорически не работает с 2-мя и более!!

И где текст ошибки ?
11 июн 13, 14:31    [14420775]     Ответить | Цитировать Сообщить модератору
 Re: 1 Джойн работает, 2 и более нет  [new]
timaxi
Member

Откуда:
Сообщений: 7
Glory,

вот он
Msg 245, Level 16, State 1, Line 1
Conversion failed when converting the varchar value 'Тип карты' to data type int.
11 июн 13, 14:34    [14420799]     Ответить | Цитировать Сообщить модератору
 Re: 1 Джойн работает, 2 и более нет  [new]
Glory
Member

Откуда:
Сообщений: 104751
И что непонятного в сообщении ?
Как по-вашему строку 'Тип карты' сконвертировать в число ?
11 июн 13, 14:37    [14420834]     Ответить | Цитировать Сообщить модератору
 Re: 1 Джойн работает, 2 и более нет  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
ReferenceBooks.[value], небось, типа SQL_VARIANT?
11 июн 13, 14:40    [14420845]     Ответить | Цитировать Сообщить модератору
 Re: 1 Джойн работает, 2 и более нет  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Вы пытаетесь конвертировать строку в цифру. Сколько будет в цифрах "тип карты" сервер вам сказать не может.
Скорее всего вопрос в каком-то из ваших CAST( ... as INT)
11 июн 13, 14:40    [14420852]     Ответить | Цитировать Сообщить модератору
 Re: 1 Джойн работает, 2 и более нет  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
цифру --> число конечно же
11 июн 13, 14:41    [14420855]     Ответить | Цитировать Сообщить модератору
 Re: 1 Джойн работает, 2 и более нет  [new]
timaxi
Member

Откуда:
Сообщений: 7
без cast работает точно так же. Я думаю, что причина в том, что ReferenceBooks организована в виде дерева
где value varchar(x).

Решение есть, я сделал уже через временные таблицы

-- 1
select cast(_s.[value] as int) as value, _s.rus_name as [Status] 
into #temp_status
from ReferenceBooks _s
	join ReferenceBooks _ss on _ss.id = _s.parent_id and _ss.owner_id = _s.parent_owner_id
	where _ss.value='CRM_Claims.Status'
-- 2
select cast(_g.[value] as int) as value, _g.rus_name as Gradient 
into #temp_gradient
from ReferenceBooks _g
	join ReferenceBooks _gg on _gg.id = _g.parent_id and _gg.owner_id = _g.parent_owner_id
	where _gg.value='CRM_Claims.Gradient'
-- 3 
select _r.[value], _r.rus_name as ClaimType 
into #temp_type
from ReferenceBooks _r
	join ReferenceBooks _rr on _rr.id = _r.parent_id and _rr.owner_id = _r.parent_owner_id
	where _rr.value='CRM_Claims.ClaimType'


и

select * into #cc from CRM_Claims where DateReg > dateadd(day, -10, getdate())
go
select
	cc.DateReg
	,ss.status
	,gg.Gradient
	,tt.ClaimType
from #cc cc
-- Выборка статуса обращения из ReferenceBooks
		join #temp_status ss on ss.value = cc.status
-- Выборка классификатора обращения из ReferenceBooks
		join #temp_gradient gg on gg.value = cc.gradient
-- Выборка типа обращения из ReferenceBooks
		join #temp_type tt on tt.value = cc.claimtype
11 июн 13, 14:45    [14420880]     Ответить | Цитировать Сообщить модератору
 Re: 1 Джойн работает, 2 и более нет  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
timaxi
где value varchar(x).
А по-Вашему, любой varchar(x) можно преобразовать в int?
11 июн 13, 14:47    [14420892]     Ответить | Цитировать Сообщить модератору
 Re: 1 Джойн работает, 2 и более нет  [new]
timaxi
Member

Откуда:
Сообщений: 7
И все-таки интересно, почему это так произошло. Думаю что именно дело в структуре.
Все равно всем спасибо за живое участие!
11 июн 13, 14:47    [14420893]     Ответить | Цитировать Сообщить модератору
 Re: 1 Джойн работает, 2 и более нет  [new]
timaxi
Member

Откуда:
Сообщений: 7
iap, нет конечно.
Но дело в том, что выбираемое жестко занесено и пустых значений быть не может в принципе.
А вот заголовок родителя (то самое "тип карты") как раз таки может туда попасть, он то и дает ошибку.
Вопрос только в том, КАК он туда попадает, если стоит where
11 июн 13, 14:49    [14420909]     Ответить | Цитировать Сообщить модератору
 Re: 1 Джойн работает, 2 и более нет  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
timaxi
iap, нет конечно.
Но дело в том, что выбираемое жестко занесено и пустых значений быть не может в принципе.
А вот заголовок родителя (то самое "тип карты") как раз таки может туда попасть, он то и дает ошибку.
Вопрос только в том, КАК он туда попадает, если стоит where
По-Вашему, сервер должен сначала фильтровать по WHERE,
а потом преобразовывать CASTом в SELECTе?
Ничего подобного! Он это делает в любом понравившемся ему порядке!
11 июн 13, 14:51    [14420924]     Ответить | Цитировать Сообщить модератору
 Re: 1 Джойн работает, 2 и более нет  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Перепишите во втором подзапросе cast так:
cast(case when isnumeric(_g.[value])=1 and _g.[value] not like '%[^ 0-9+-]%' then _g.[value] end as int)
11 июн 13, 14:54    [14420951]     Ответить | Цитировать Сообщить модератору
 Re: 1 Джойн работает, 2 и более нет  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
iap
Перепишите во втором подзапросе cast так:
cast(case when isnumeric(_g.[value])=1 and _g.[value] not like '%[^ 0-9+-]%' then _g.[value] end as int)
Можно добавить проверку на переполнение:
cast
(
 case
  when isnumeric(_g.[value])=1
   and _g.[value] not like '%[^ 0-9+-]%'
   and len(replace(replace(replace(_g.[value],' ',''),'-',''),'+',''))<=10
  then case when cast(_g.[value] as bigint) between -2147483648 AND 2147483647 then _g.[value] end
 end
 as int
)
11 июн 13, 15:00    [14420995]     Ответить | Цитировать Сообщить модератору
 Re: 1 Джойн работает, 2 и более нет  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
iap
Ничего подобного! Он это делает в любом понравившемся ему порядке!

Я не уверен, но мне кажется, что то, что оно "нормально" отработало у автора через временные таблицы --своего рода "повезло"
11 июн 13, 15:11    [14421068]     Ответить | Цитировать Сообщить модератору
 Re: 1 Джойн работает, 2 и более нет  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Cammomile
iap
Ничего подобного! Он это делает в любом понравившемся ему порядке!

Я не уверен, но мне кажется, что то, что оно "нормально" отработало у автора через временные таблицы --своего рода "повезло"
Если запрос зависит от сиюминутного состояния данных,
то это говнокод, которого следует стыдится.
Программа должна корректно обрабатывать все допустимые ситуации.
11 июн 13, 15:14    [14421088]     Ответить | Цитировать Сообщить модератору
 Re: 1 Джойн работает, 2 и более нет  [new]
samoxod
Member

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

А может проще в темповой таблице cc.status, cc.gradient, cc.claimtype сделать VARCHAR(X) и убрать совсем CAST в подзапросах?
11 июн 13, 15:15    [14421100]     Ответить | Цитировать Сообщить модератору
 Re: 1 Джойн работает, 2 и более нет  [new]
timaxi
Member

Откуда:
Сообщений: 7
iap, у Вас замечательное чувство юмора! )))
11 июн 13, 15:19    [14421133]     Ответить | Цитировать Сообщить модератору
 Re: 1 Джойн работает, 2 и более нет  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
timaxi
iap, у Вас замечательное чувство юмора! )))
А по делу что скажете?
11 июн 13, 15:23    [14421169]     Ответить | Цитировать Сообщить модератору
 Re: 1 Джойн работает, 2 и более нет  [new]
timaxi
Member

Откуда:
Сообщений: 7
samoxod, структура изменению не подлежит, работает уже много лет
11 июн 13, 15:40    [14421302]     Ответить | Цитировать Сообщить модератору
 Re: 1 Джойн работает, 2 и более нет  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Кстати, зачем там вообще подзапросы, непонятно.
Просто joinы не катят?
Хотя, наверно, всё равно...
11 июн 13, 15:45    [14421335]     Ответить | Цитировать Сообщить модератору
 Re: 1 Джойн работает, 2 и более нет  [new]
samoxod
Member

Откуда: Москва
Сообщений: 31
timaxi,
хм...
так ведь #cc же тут же дропается после селекта...
11 июн 13, 15:47    [14421361]     Ответить | Цитировать Сообщить модератору
 Re: 1 Джойн работает, 2 и более нет  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
samoxod
timaxi,
хм...
так ведь #cc же тут же дропается после селекта...
Так ведь и GO в нормальном запросе не напишешь.
Я думаю, это для примера так написаено
11 июн 13, 15:50    [14421394]     Ответить | Цитировать Сообщить модератору
 Re: 1 Джойн работает, 2 и более нет  [new]
samoxod
Member

Откуда: Москва
Сообщений: 31
iap,
Жаль, что мы не увидели структуры таблиц и индексы
Но мне кажется 4 временных таблицы, чтобы расшифровать значения из одного справочника - это перебор...
11 июн 13, 16:03    [14421487]     Ответить | Цитировать Сообщить модератору
 Re: 1 Джойн работает, 2 и более нет  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
> так ведь #cc же тут же дропается после селекта...

с чего бы это?
11 июн 13, 16:06    [14421503]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить