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

Откуда:
Сообщений: 271
Столкнулся с ситуацией, когда запрос к таблице фактов возвращает ошибку, а отловить записи в справочнике, которые приводят к ошибке (вопрос в датах) не могу
Сам запрос возвращает все записи с таблицы фактов, плюс вычисляемое поле с справочника. Если бы справочник был заполнен правильно, вложенный запрос вернул бы одно значение на одну запись таблицы фактов. Но по факту в справочнике в записях ошибки, которые выловить не могу.
Может можно как-то просмотреть, на какой записи таблицы фактов возникает ошибка?
24 авг 15, 22:29    [18061993]     Ответить | Цитировать Сообщить модератору
 Re: Узнать, на какой записи с таблицы запрос завершается с ошибкой  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
2viper2viper
Может можно как-то просмотреть, на какой записи таблицы фактов возникает ошибка?
Перебрать все записи по одной. По-другому неизвестные ошибки не ловятся.
24 авг 15, 23:43    [18062162]     Ответить | Цитировать Сообщить модератору
 Re: Узнать, на какой записи с таблицы запрос завершается с ошибкой  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
2viper2viper,


автор
Узнать, на какой записи с таблицы запрос завершается с ошибкой


если в лоб не пытаясь разобраться в запросе, то так, например :)

делением куска данных пополам.

1) запускаешь запрос на первой половине данных, если ошибки нет (2), если ошибка есть (3)
2) запускаешь запрос на второй половине, если ошибки нет (4), если ошибка есть (3)
3) делим текущую половину на две части (логически) и дальше (1), если не делится, значит ты уперся в "кривую" строку
4) все норм.

в миллиарде строк на log(2)(1000000000) ~ 30 шагов найдешь кривую строку или локализуеш группу строк.
25 авг 15, 00:15    [18062212]     Ответить | Цитировать Сообщить модератору
 Re: Узнать, на какой записи с таблицы запрос завершается с ошибкой  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Курсор внутри блока TRY-CATCH
В CATCH вывод идентифицирующей информации
25 авг 15, 08:29    [18062449]     Ответить | Цитировать Сообщить модератору
 Re: Узнать, на какой записи с таблицы запрос завершается с ошибкой  [new]
o-o
Guest
2viper2viper,

Вам так жалко показать запрос и ошибку? К неизвестным/необнародованным ошибкам применяется совет Гавриленко.
Если же ваше описание намекает на subquery returned more than one value, то вместо этого value попробуйте вместо значения вернуть count этих значений, отфильтруйте, где больше одного, это и есть входные данные для завала
25 авг 15, 09:13    [18062608]     Ответить | Цитировать Сообщить модератору
 Re: Узнать, на какой записи с таблицы запрос завершается с ошибкой  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
2viper2viper
Может можно как-то просмотреть, на какой записи таблицы фактов возникает ошибка?
2 варианта:
1) перебрать записи курсором
2) вывести все записи с проверкой на соответствие "правильному" формату (или вывести те, которые не соответствуют)
2viper2viper
Если бы справочник был заполнен правильно, вложенный запрос вернул бы одно значение на одну запись таблицы фактов
Совершенно не обязательно.
Частая ошибка проектировщиков "универсальных таблиц и процедур" - думать, что если они указали ограничение в WHERE на некие записи, то только эти записи и будут обрабатываться.
А это не так, оптимизатор может решить, что выгоднее действовать по другому.
25 авг 15, 10:49    [18063184]     Ответить | Цитировать Сообщить модератору
 Re: Узнать, на какой записи с таблицы запрос завершается с ошибкой  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
alexeyvg
1) перебрать записи курсором

Скорее всего так и сделаю. Спасибо за совет
alexeyvg
2) вывести все записи с проверкой на соответствие "правильному" формату (или вывести те, которые не соответствуют)

alexeyvg
]Совершенно не обязательно

в справочнике - список историй должностей сотрудников. В таблице фактов нужно добавить вычисляемый столбец с ID записи со справочника по дате платежа, которая подпадает под определенный диапазон дат в истории должностей (определить, какой должности соответствовал сотрудник на момент продажи). Проблема в том, что диапазоны перекресчиваются, как оказалось

как вариант, искать в справочнике такие проблемные диапазоны
25 авг 15, 11:46    [18063604]     Ответить | Цитировать Сообщить модератору
 Re: Узнать, на какой записи с таблицы запрос завершается с ошибкой  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
Гавриленко Сергей Алексеевич, churupaha
так и начал делать, но ошибок оказалось очень много. а таблица фактов содержит более 2,5 млн записей, справочник 1,5 тыс
25 авг 15, 11:47    [18063619]     Ответить | Цитировать Сообщить модератору
 Re: Узнать, на какой записи с таблицы запрос завершается с ошибкой  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
Cygapb-007
Курсор внутри блока TRY-CATCH
В CATCH вывод идентифицирующей информации


попробую, еще не приходилось применять на sql
25 авг 15, 11:49    [18063638]     Ответить | Цитировать Сообщить модератору
 Re: Узнать, на какой записи с таблицы запрос завершается с ошибкой  [new]
o-o
Guest
жаловаться -- оно, конечно, продуктивнее, чем запрос и ошибку показать.
поможем 2viper2viper массовым сочувствием
25 авг 15, 11:50    [18063644]     Ответить | Цитировать Сообщить модератору
 Re: Узнать, на какой записи с таблицы запрос завершается с ошибкой  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
o-o
жаловаться -- оно, конечно, продуктивнее, чем запрос и ошибку показать.
поможем 2viper2viper массовым сочувствием


почему Вы так воспринимаете? я не жалуюсь. описал ситуацию и ошибку - возвращение более одного значения во вложенном запросе. когда должно было быть только по одному - получил ответ. сейчас пишу запрос с курсором в исключениях.
Вопрос не в текущей ошибке, а том, как отловить ошибку в любом запросе
25 авг 15, 12:14    [18063823]     Ответить | Цитировать Сообщить модератору
 Re: Узнать, на какой записи с таблицы запрос завершается с ошибкой  [new]
o-o
Guest
2viper2viper
описал ситуацию и ошибку - возвращение более одного значения во вложенном запросе. когда должно было быть только по одному - получил ответ. сейчас пишу запрос с курсором в исключениях.
Вопрос не в текущей ошибке, а том, как отловить ошибку в любом запросе

вот из всех ответов как раз мой имеет прямую подсказку,
как отловить те строки, на к-ых подзапрос возвращает более одного значения:
o-o
2viper2viper,
Вам так жалко показать запрос и ошибку? К неизвестным/необнародованным ошибкам применяется совет Гавриленко.
Если же ваше описание намекает на subquery returned more than one value, то вместо этого value попробуйте вместо значения вернуть count этих значений, отфильтруйте, где больше одного, это и есть входные данные для завала

и если бы вы запостили сюда свой запрос, получили бы уже переписанный, выводящий за 1 раз все "ошибочные" строки.

ваше описание в первом посте такое расплывчатое, что про подзапрос другие вообще не восприняли.
но если вам нужен универсальный способ, то вам повезло, что у вас не миллиарды строк.
т.к. в любом конкретном можно обойтись малой кровью, а универсальный перебор в курсоре
может длиться неделю
25 авг 15, 12:22    [18063880]     Ответить | Цитировать Сообщить модератору
 Re: Узнать, на какой записи с таблицы запрос завершается с ошибкой  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
churupaha
2viper2viper,


автор
Узнать, на какой записи с таблицы запрос завершается с ошибкой


если в лоб не пытаясь разобраться в запросе, то так, например :)

делением куска данных пополам.

1) запускаешь запрос на первой половине данных, если ошибки нет (2), если ошибка есть (3)
2) запускаешь запрос на второй половине, если ошибки нет (4), если ошибка есть (3)
3) делим текущую половину на две части (логически) и дальше (1), если не делится, значит ты уперся в "кривую" строку
4) все норм.

в миллиарде строк на log(2)(1000000000) ~ 30 шагов найдешь кривую строку или локализуеш группу строк.


Может начать с того, что запрос в студию с комментарием, что там может падать
25 авг 15, 16:01    [18065718]     Ответить | Цитировать Сообщить модератору
 Re: Узнать, на какой записи с таблицы запрос завершается с ошибкой  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
a_voronin
Может начать с того, что запрос в студию с комментарием, что там может падать
Это не спортивно.
25 авг 15, 16:04    [18065759]     Ответить | Цитировать Сообщить модератору
 Re: Узнать, на какой записи с таблицы запрос завершается с ошибкой  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
2viper2viper
в справочнике - список историй должностей сотрудников. В таблице фактов нужно добавить вычисляемый столбец с ID записи со справочника по дате платежа, которая подпадает под определенный диапазон дат в истории должностей (определить, какой должности соответствовал сотрудник на момент продажи). Проблема в том, что диапазоны перекресчиваются, как оказалось

как вариант, искать в справочнике такие проблемные диапазоны
А, это диапазоны... Ну тогда да, нужно просто их найти, придумав соотв условие.
25 авг 15, 16:17    [18065890]     Ответить | Цитировать Сообщить модератору
 Re: Узнать, на какой записи с таблицы запрос завершается с ошибкой  [new]
o-o
Guest
alexeyvg
2viper2viper
в справочнике - список историй должностей сотрудников. В таблице фактов нужно добавить вычисляемый столбец с ID записи со справочника по дате платежа, которая подпадает под определенный диапазон дат в истории должностей (определить, какой должности соответствовал сотрудник на момент продажи). Проблема в том, что диапазоны перекресчиваются, как оказалось

как вариант, искать в справочнике такие проблемные диапазоны
А, это диапазоны... Ну тогда да, нужно просто их найти, придумав соотв условие.

ему уже подсказано самое простое условие на случай "Subquery returned...".
не вдаваясь в подробности, зачем тут вообще subquery вместо join-а,
имеем пример:
declare @t1 table (id_person int, name varchar(100));
declare @t2 table (id_person int, dt_start date, dt_end date, kem_byl varchar(100));

insert into @t1 
values (1, 'Vasja'), (2, 'Petja'), (3, 'Kolja');

insert into @t2
values (1, '20130101', '20130201', 'developer'),
       (2, '20150101', '20150201', 'developer'),
       (2, '20150115', '20150116', 'dba'),
       (3, '20150101', '20150301', 'developer');
       
select t1.name,
       kem_byl = (select kem_byl from @t2 t2 where t1.id_person = t2.id_person) 
from @t1 t1;

Msg 512, Level 16, State 1, Line 13
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

меняем kem_byl на count(kem_byl), фильтруем на > 1:
select t1.name,
       kem_byl_skolko_raz = (select count(kem_byl) from @t2 t2 where t1.id_person = t2.id_person) 
from @t1 t1
where (select count(kem_byl) from @t2 t2 where t1.id_person = t2.id_person) > 1;
---
name	kem_byl_skolko_raz
Petja	2
25 авг 15, 17:59    [18066662]     Ответить | Цитировать Сообщить модератору
 Re: Узнать, на какой записи с таблицы запрос завершается с ошибкой  [new]
sphinx_mv
Member [заблокирован]

Откуда:
Сообщений: 1672
o-o
alexeyvg
пропущено...
А, это диапазоны... Ну тогда да, нужно просто их найти, придумав соотв условие.

ему уже подсказано самое простое условие на случай "Subquery returned...".
не вдаваясь в подробности, зачем тут вообще subquery вместо join-а,
имеем пример:
declare @t1 table (id_person int, name varchar(100));
declare @t2 table (id_person int, dt_start date, dt_end date, kem_byl varchar(100));

insert into @t1 
values (1, 'Vasja'), (2, 'Petja'), (3, 'Kolja');

insert into @t2
values (1, '20130101', '20130201', 'developer'),
       (2, '20150101', '20150201', 'developer'),
       (2, '20150115', '20150116', 'dba'),
       (3, '20150101', '20150301', 'developer');
       
select t1.name,
       kem_byl = (select kem_byl from @t2 t2 where t1.id_person = t2.id_person) 
from @t1 t1;

Msg 512, Level 16, State 1, Line 13
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

меняем kem_byl на count(kem_byl), фильтруем на > 1:
select t1.name,
       kem_byl_skolko_raz = (select count(kem_byl) from @t2 t2 where t1.id_person = t2.id_person) 
from @t1 t1
where (select count(kem_byl) from @t2 t2 where t1.id_person = t2.id_person) > 1;
---
name	kem_byl_skolko_raz
Petja	2
Чур меня, чур!..
GROUP BY и HAVING
25 авг 15, 19:55    [18067335]     Ответить | Цитировать Сообщить модератору
 Re: Узнать, на какой записи с таблицы запрос завершается с ошибкой  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
[quot a_voronin]
churupaha
2viper2viper,

churupaha
если в лоб не пытаясь разобраться в запросе, то так, например :)


Может начать с того, что запрос в студию с комментарием, что там может падать
25 авг 15, 20:04    [18067360]     Ответить | Цитировать Сообщить модератору
 Re: Узнать, на какой записи с таблицы запрос завершается с ошибкой  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
a_voronin
churupaha
2viper2viper,
если в лоб не пытаясь разобраться в запросе, то так, например :)


Может начать с того, что запрос в студию с комментарием, что там может падать


может, какой вопрос такой ответ.
25 авг 15, 20:06    [18067366]     Ответить | Цитировать Сообщить модератору
 Re: Узнать, на какой записи с таблицы запрос завершается с ошибкой  [new]
o-o
Guest
sphinx_mv
o-o
declare @t1 table (id_person int, name varchar(100));
declare @t2 table (id_person int, dt_start date, dt_end date, kem_byl varchar(100));

insert into @t1 
values (1, 'Vasja'), (2, 'Petja'), (3, 'Kolja');

insert into @t2
values (1, '20130101', '20130201', 'developer'),
       (2, '20150101', '20150201', 'developer'),
       (2, '20150115', '20150116', 'dba'),
       (3, '20150101', '20150301', 'developer');
       
select t1.name,
       kem_byl = (select kem_byl from @t2 t2 where t1.id_person = t2.id_person) 
from @t1 t1;

select t1.name,
       kem_byl_skolko_raz = (select count(kem_byl) from @t2 t2 where t1.id_person = t2.id_person) 
from @t1 t1
where (select count(kem_byl) from @t2 t2 where t1.id_person = t2.id_person) > 1;
Чур меня, чур!..
GROUP BY и HAVING

чем это не устроил мой вариант, кроме чуров?
ну и заодно давайте ваш вариант, переписанный через having.
причем никаких соединений, у ТС с подзапросом и менять его не намерен
25 авг 15, 20:12    [18067399]     Ответить | Цитировать Сообщить модератору
 Re: Узнать, на какой записи с таблицы запрос завершается с ошибкой  [new]
o-o
Guest
churupaha
a_voronin
пропущено...
Может начать с того, что запрос в студию с комментарием, что там может падать

может, какой вопрос такой ответ.

ТС считает, что ошибку "описал".
правда, мою трактовку не подтвердил, но там оно самое.
а теперь на меня еще и HAVING вешают, будто это У МЕНЯ подзапрос более 1 значения возвращает
25 авг 15, 20:15    [18067411]     Ответить | Цитировать Сообщить модератору
 Re: Узнать, на какой записи с таблицы запрос завершается с ошибкой  [new]
sphinx_mv
Member [заблокирован]

Откуда:
Сообщений: 1672
o-o
sphinx_mv
пропущено...
Чур меня, чур!..
GROUP BY и HAVING

чем это не устроил мой вариант, кроме чуров?
Тем, что Ваш вариант запроса - безграмотный. И это - очень мягко говоря. Так полегчало?
o-o
ну и заодно давайте ваш вариант, переписанный через having.
причем никаких соединений, у ТС с подзапросом и менять его не намерен
Для того, чтобы найти записи с дубликатами, запрос ТСа не нужен - ни с соединениями, ни с позапросами! ВООБЩЕ!
"Необходимо и достаточно" (с) выполнить один маленький и крайне банальный запрос:
SELECT id_person FROM @t2 GROUP BY id_person HAVING COUNT(*) > 1 
НО!
Это если допустить, что проблема ТСа действительно связана с, якобы, ошибкой дублирования данных.

А на самом деле, проблема заключается в том, что история сотрудников по должностям ИЗНАЧАЛЬНО ОБЯЗАНА ПРЕДПОЛАГАТЬ, что для одного сотрудника МОЖЕТ быть БОЛЬШЕ одной записи: был программистом - стал руководителем отдела. Не говоря уже о том, что за одну дату может быть сильно больше одного платежа. И отсюда непосредственно следует неправильная (неполная, некорректная) ПОСТАНОВКА задачи, которую решает ТС - и это средствами SQL-сервера ни разу не решается.
25 авг 15, 21:59    [18067725]     Ответить | Цитировать Сообщить модератору
 Re: Узнать, на какой записи с таблицы запрос завершается с ошибкой  [new]
o-o
Guest
о блин,
да инпут был "Если бы справочник был заполнен правильно, вложенный запрос вернул бы одно значение на одну запись таблицы фактов".
что ж вы со своим шаром так поздно прибежали, когда ТС уже частично раскололся и примерно рассказал, в чем там дело?
мы тут ему строим универсальный супер-пупер запрос по отлавливанию того, не знаю чего,
и тут заваливается sphinx_mv и выжирает выстраданный плод совместных усилий + еще и огрызком кидается
лично я умываю руки
25 авг 15, 22:10    [18067764]     Ответить | Цитировать Сообщить модератору
 Re: Узнать, на какой записи с таблицы запрос завершается с ошибкой  [new]
sphinx_mv
Member [заблокирован]

Откуда:
Сообщений: 1672
o-o
о блин,
да инпут был "Если бы справочник был заполнен правильно, вложенный запрос вернул бы одно значение на одну запись таблицы фактов".
Не смешно. Ибо уже давно было (дословно):
2viper2viper
в справочнике - список историй должностей сотрудников.
o-o
что ж вы со своим шаром так поздно прибежали, когда ТС уже частично раскололся и примерно рассказал, в чем там дело?
Ну, как только бред-детектор сработал - так сразу и прибежал... Что не так?
o-o
мы тут ему строим универсальный супер-пупер запрос по отлавливанию того, не знаю чего,
Перед тем как героически писать супер-запросы (на все случаи жизни) надо включать мозги - ну, хотя бы на пару минут...
o-o
и тут заваливается sphinx_mv и выжирает выстраданный плод совместных усилий + еще и огрызком кидается
Ну, вот лично Ваших "страданий" хватило аккурат на бредовый запрос, место которому - мусорная корзина.
И Вам "прилетел тапок" только за его семантику и синтаксис...
o-o
лично я умываю руки
Здравая мысль!
А как умоете, берете с полки "Понимание SQL" Мартина Грубера (ну, хотя бы!) - и "учиться, учиться и учиться" (с). Там точно есть про совместное использование GROUP BY и HAVING...
25 авг 15, 23:24    [18067981]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить