2014-02-20 5 views
0

Я надеюсь, что некоторые из вас помогут мне в этом. Мои SQL-навыки довольно слабы, и на моей работе выполняется большая работа SSIS, которая сейчас не работает. Он работает отлично в течение 3 лет с тех пор, как я начал без проблем, но за последние 48 часов он провалился дважды. Ошибка заключается в следующем:SQL Subquery вернул более 1 значения, запутанные в дизайне запроса?

Подзапрос возвратил более 1 значения. Это недопустимо, если подзапрос следует за =,! =, <, < =,>,> = или когда подзапрос используется как выражение.

Я подтвердил (насколько могу), что никаких изменений в структуре/дизайне базы данных ничего не было, но, к сожалению, это все, что я могу сделать. В противном случае этот прекрасный вопрос выпадает на меня.

Я понимаю, что ошибка означает, что я получаю несколько записей назад, когда я должен их получить, но это примерно столько, сколько я понимаю.

Поток этого задания выглядит следующим образом: таблица ProvUserDefinedDataRotated отбрасывается каждую ночь, а затем следующий запрос запускается сразу после этого.

SELECT objectinternalid, 
     FaxComments = Isnull ((SELECT value 
           FROM provuserdefineddata 
           WHERE userdefinedfieldinternalid = 75 
            AND objectinternalid = Q.objectinternalid), 
        ''), 
     FaxCommentsDate = Isnull ((SELECT value 
            FROM provuserdefineddata 
            WHERE userdefinedfieldinternalid = 76 
             AND objectinternalid = 
              Q.objectinternalid), '' 
         ), 
     Specialty = Isnull ((SELECT value 
          FROM provuserdefineddata 
          WHERE userdefinedfieldinternalid = 77 
            AND objectinternalid = Q.objectinternalid), 
        ''), 
     DepartmentFullDescript = Isnull ((SELECT value 
             FROM provuserdefineddata 
             WHERE userdefinedfieldinternalid = 78 
               AND objectinternalid = 
                Q.objectinternalid), ''), 
     Alerts1 = Isnull ((SELECT value 
          FROM provuserdefineddata 
          WHERE userdefinedfieldinternalid = 79 
           AND objectinternalid = Q.objectinternalid), '') 
     , 
     ProviderStatus = Isnull ((SELECT value 
           FROM provuserdefineddata 
           WHERE userdefinedfieldinternalid = 80 
             AND objectinternalid = 
              Q.objectinternalid), ''), 
     ProviderRole = Isnull ((SELECT value 
           FROM provuserdefineddata 
           WHERE userdefinedfieldinternalid = 81 
             AND objectinternalid = 
         Q.objectinternalid), ''), 
     ProfessionalTitle = Isnull ((SELECT value 
            FROM provuserdefineddata 
            WHERE userdefinedfieldinternalid = 82 
              AND objectinternalid = 
               Q.objectinternalid), 
          ''), 
     SignatureBlockTitle = Isnull ((SELECT value 
             FROM provuserdefineddata 
             WHERE userdefinedfieldinternalid = 96 
              AND objectinternalid = 
          Q.objectinternalid), ''), 
     AlertsUsedWithProfTitles = Isnull ((SELECT value 
              FROM provuserdefineddata 
              WHERE userdefinedfieldinternalid = 
                98 
                AND objectinternalid = 
                 Q.objectinternalid), ''), 
     ProfTitleAlertDescrpt = Isnull ((SELECT value 
             FROM provuserdefineddata 
             WHERE userdefinedfieldinternalid = 99 
               AND objectinternalid = 
                Q.objectinternalid), ''), 
     ProviderFullFaxNumber = Isnull ((SELECT value 
             FROM provuserdefineddata 
             WHERE userdefinedfieldinternalid = 102 
               AND objectinternalid = 
                Q.objectinternalid), ''), 
     NonEsig = Isnull ((SELECT value 
          FROM provuserdefineddata 
          WHERE userdefinedfieldinternalid = 112 
           AND objectinternalid = Q.objectinternalid), '') 
     , 
     EsigEWSTrainNotes = Isnull ((SELECT value 
            FROM provuserdefineddata 
            WHERE userdefinedfieldinternalid = 146 
              AND objectinternalid = 
               Q.objectinternalid), 
          ''), 
     ESigEWSTrainedDate = Isnull ((SELECT value 
            FROM provuserdefineddata 
            WHERE userdefinedfieldinternalid = 147 
              AND objectinternalid = 
               Q.objectinternalid), 
          ''), 
     EPICTrained = Isnull ((SELECT value 
           FROM provuserdefineddata 
           WHERE userdefinedfieldinternalid = 163 
            AND objectinternalid = Q.objectinternalid), 
        ''), 
     EPICTrainedDate = Isnull ((SELECT value 
            FROM provuserdefineddata 
            WHERE userdefinedfieldinternalid = 164 
             AND objectinternalid = 
              Q.objectinternalid), '' 
         ) 
INTO provuserdefineddatarotated 
FROM provuserdefineddata Q 
GROUP BY objectinternalid 
ORDER BY objectinternalid 

Из моего ограниченного понимания, похоже, этот запрос только копирует данные в только что созданный ProvUserDefinedDataRotated таблицы после указанной таблицы отбрасывается?

Я запутался на то, что отдельные высказывания как этот

FaxComments = Isnull ((SELECT value 
          FROM provuserdefineddata 
          WHERE userdefinedfieldinternalid = 75 
           AND objectinternalid = Q.objectinternalid), 
       ''), 

на самом деле означает, хотя. Я просто не понимаю, что происходит в этом коде. :(

Любые объяснения по проектированию этого запроса и/или рекомендации о том, как устранить это вообще было бы так оценил. Я яростно прибегая к помощи но безрезультатно.

Спасибо!

+0

Будьте уверены, что тот, кто написал этот SQL, сделал плохую работу и оставил в нем бомбу замедленного действия, которая в конце концов взорвется. –

ответ

1

В основе этого запроса лежит поиск записей из таблицы provuserdefineddata.Драйвер из этой таблицы - это столбец objectinternalid Это значение затем используется для поиска совпадения в той же таблице на основе userdefinedfieldinternalid различных типов.

В этом фрагменте

FaxComments = IsNull ((SELECT, значение ОТ provuserdefineddata ГДЕ userdefinedfieldinternalid = 75 И objectinternalid = Q.objectinternalid), ''),

чтения, что, как Получить " значение "из таблицы provuserdefineddata, которая имеет userdefinedfieldinternalid из 75 и соответствует объекту internalid из основной таблицы. О, и если мы не найдем ничего (isnull), сделаем пустую строку.

Этот механизм предполагает, что будет найдено ноль до одного найденного товара. Поиск нескольких результатов приводит к прекрасной ошибке.

Итак, вы правы в том, что код не изменился, а что-то, где-то ввел данные, которых не должно быть.

Как вы его решаете? Без изменения кода вам необходимо идентифицировать комманды userdefinedfieldinternalid и objectinternalid, которые отображаются более одного раза (для списка идентификаторов выше).

Более безопасный способ его решения, помимо полного реорганизации этого проекта базы данных, заключается в применении top 1 или агрегата max/min к подзапросам.

+0

Спасибо, я полностью понимаю это сейчас! Я смог отслеживать дубликаты записей и обращаться к операционным пользователям, которые их создали для решения! – Oryx

1

Здесь это объяснение IsNull:. http://technet.microsoft.com/en-us/library/ms184325.aspx

Короче для isNull(select value ..., '')

if (the inner select value is null) 
then return '' 
else return value of inner select 

Проблема с вашим запросом заключается в том, что эти подзапросы должны возвращать одно или никакое значение. (Это просто правило).

В ваших подзапросах вы всегда запрашиваете одну и ту же таблицу. Следовательно, для одного конкретного userdefinedfieldinternalid и objectinternalid должно быть несколько значений. Не ограничивая userdefinedfieldinternalid до тех значений, которые вы использовали вы можете выбрать «мульти» значение с выбором, как:

SELECT userdefinedfieldinternalid, objectinternalid FROM provuserdefineddata group by userdefinedfieldinternalid, objectinternalid having count(*)>1 

Я надеюсь, что я получил правильный синтаксис для системы управления базами данных.

Смежные вопросы