2016-12-20 3 views
1

У меня возникли проблемы со следующим утверждением обновления:SQL - Подзапрос возвращает более 1 значения. - Несколько баз данных

UPDATE tblPerson 
SET personStatus = 'Candidate' 
WHERE PersonID = 
(
    SELECT DISTINCT 
     p.PersonnelID 
    FROM 
     [Beyond-Auckland].dbo.Personnel p 
    WHERE 
     EXISTS (SELECT ID FROM [Beyond-Auckland].dbo.LinkedDocuments L WHERE id = p.PersonnelId 
               AND  SiteName IS NOT NULL 
               AND  (Document LIKE ('%CV%') 
               OR  Document LIKE ('%resume%') 
               OR  Document LIKE ('%Vitae%') 
               OR  Document LIKE ('%Cover Letter%')))) 

я получаю следующее сообщение об ошибке:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

Не совсем уверен, что я делаю неправильно здесь, любая помощь будет Очень благодарен

+1

* следующий оператор обновления: *, а затем запрос 'SELECT'. Пожалуйста, добавьте запрос 'UPDATE' –

+0

Выбранный нам' SELECT' не должен генерировать эту ошибку. –

+0

Извините, что я загрузил не ту вещь, обновил ее сейчас. –

ответ

0

Использование IN оператор

UPDATE tblPerson 
SET personStatus = 'Candidate' 
WHERE PersonID IN (SELECT p.PersonnelID 
        FROM [Beyond-Auckland].dbo.Personnel p 
        WHERE EXISTS (SELECT ID 
            FROM [Beyond-Auckland].dbo.LinkedDocuments L 
            WHERE id = p.PersonnelId 
              AND SiteName IS NOT NULL 
              AND (Document LIKE '%CV%' --Here 
               OR Document LIKE '%resume%' 
               OR Document LIKE '%Vitae%' 
               OR Document LIKE '%Cover Letter%'))) 

Кроме того, необходимо добавить скобка применить OR оператор правильно. AND имеет более высокий приоритет, чем OR оператора, так что будет оцениваться первым

Ваш текущий Where пункт будет обрабатываться как этот

WHERE id = p.PersonnelId 
     AND (SiteName IS NOT NULL AND Document LIKE '%CV%') 
     OR Document LIKE '%resume%' 
     OR Document LIKE '%Vitae%' 
     OR Document LIKE '%Cover Letter%' 
0

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

UPDATE tblPerson 
    SET personStatus = 'Candidate' 
    WHERE PersonID IN 
    (
     SELECT DISTINCT 
      p.PersonnelID 
     FROM 
      [Beyond-Auckland].dbo.Personnel p 
     WHERE 
      EXISTS (SELECT ID FROM [Beyond-Auckland].dbo.LinkedDocuments L WHERE id = p.PersonnelId 
                AND  SiteName IS NOT NULL 
                AND  (Document LIKE ('%CV%') 
                OR  Document LIKE ('%resume%') 
                OR  Document LIKE ('%Vitae%') 
                OR  Document LIKE ('%Cover Letter%')))) 
+0

Ха-ха, спасибо, я чувствую себя глупо за то, что не хватает этого. –

0

Проверьте это.

  UPDATE tblPerson 
      SET personStatus = 'Candidate' 
      WHERE PersonID = 
      (
       SELECT DISTINCT 
        p.PersonnelID 
       FROM 
        [Beyond-Auckland].dbo.Personnel p 
       WHERE 
        PersonID IN (SELECT ID FROM [Beyond-Auckland].dbo.LinkedDocuments L WHERE id = p.PersonnelId 
                  AND  SiteName IS NOT NULL 
                  AND  (Document LIKE ('%CV%') 
                  OR  Document LIKE ('%resume%') 
                  OR  Document LIKE ('%Vitae%') 
                  OR  Document LIKE ('%Cover Letter%')))) 
0

Использование Просто JOIN вместо IN и EXISTS, как показано ниже:

UPDATE tp SET personStatus = 'Candidate' 
FROM tblPerson tp 
INNER JOIN [Beyond-Auckland].dbo.Personnel p ON tp.PersonID = p.PersonnelID 
INNER JOIN [Beyond-Auckland].dbo.LinkedDocuments L ON id = p.PersonnelId 
    AND SiteName IS NOT NULL 
    AND (Document LIKE ('%CV%') OR Document LIKE ('%resume%') OR Document LIKE ('%Vitae%') OR Document LIKE ('%Cover Letter%')) 
0
Directly update from table 2 to table 1 : 

UPDATE tblPerson SET personStatus = 'Candidate' 
FROM [Beyond-Auckland].dbo.Personnel P 
WHERE p.PersonnelID = tblPerson.PersonID AND 
EXISTS 
(
    SELECT 1 FROM [Beyond-Auckland].dbo.LinkedDocuments L WHERE id = 
    p.PersonnelId AND SiteName IS NOT NULL AND 
    (
    Document LIKE ('%CV%') OR 
    Document LIKE ('%resume%') OR  
    Document LIKE ('%Vitae%') OR 
    Document LIKE ('%Cover Letter%') 
) 
) 
Смежные вопросы