2015-05-04 3 views
1

Im получение ошибки:Подзапрос возвратил более 1 значения. Это запрещено. Где ошибка?

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

Im, запутавшись, потому что он говорит мне, что ошибка происходит в строке 2, я не вижу, как это возможно?

UPDATE .patient_insurance 
SET insurance_sequence = CASE def_cob 
     WHEN 1 THEN 'Primary' 
     WHEN 2 THEN 'Secondary' 
     WHEN 3 THEN 'Third' 
     WHEN 4 THEN 'Fourth' 
     WHEN 5 THEN 'Fifth' 
     WHEN 6 THEN 'Sixth' 
     WHEN 7 THEN 'Seventh' 
     WHEN 8 THEN 'Eigth' 
     WHEN 9 THEN 'Ninth' 
     END 
    ,status_flag = CASE active_ind 
     WHEN 'Y' THEN 'Yes' 
     ELSE 'No' 
     END 
    ,insurance_company_id = (
     SELECT id 
     FROM insurance 
     WHERE companyname = payer_name 
     ) 
    ,insurance_number = policy_nbr 
    ,policy_group = group_nbr 
FROM person_payer 
    ,person 
WHERE person.person_id = person_payer.person_id 
    AND EXISTS (
     SELECT * 
     FROM patient_insurance 
     WHERE cast(person_payer_id AS VARCHAR(50)) = isnull(custom_field_22, '') 
     ) 
    AND isnull(custom_field_22, '') = cast(person_payer_id AS VARCHAR(50)) 
+1

выполните свой подзапрос самостоятельно и посмотрите, сколько строк он возвращает. –

+0

У вас есть два подзапроса, только один из которых следует за '='. (Важно, чтобы на самом деле * читать слова в сообщении об ошибке * - они содержат полезную информацию.) Прочитайте запросы, выясните, какой из двух он основан на этой информации, а затем выполните этот подзапрос сами по себе, чтобы увидеть что он возвращает. –

ответ

5

Этой линия

insurance_company_id = 
(select id from insurance where companyname = payer_name), 

Это говорит вам, что подзапрос возвращается с более чем одной строкой, и она не может присвоить значение из нескольких строк одного столбца в одной строке ,

1

Номера строк в этих ошибках часто бессмысленны. Обычно это дает вам позицию утверждения, которое запустило все это, что, вероятно, в строке 2 в вашем случае.

Измените это на SELECT, чтобы просмотреть COUNT() строк, возвращаемых подзапросом, для каждой строки в вашей базовой таблице. Один или несколько из них имеют более одного страхования.id, который возвращается вашим подзапросом.

Например:

select 
    person_payer_id, 
    payer_name, 
    (select count(id) from insurance where companyname = payer_name) as payer_name_count, 
    insurance_number = policy_nbr, 
    policy_group = group_nbr 
from 
    person_payer,person 
where 
    person.person_id = person_payer.person_id 
    and exists 
    (
    select 
     * 
    from 
     patient_insurance 
    where 
     cast(person_payer_id as varchar(50)) = isnull(custom_field_22,'')) 
     and isnull(custom_field_22,'') = cast(person_payer_id as varchar(50) 
    ) 

Вот версия, которая изолирует эти оскорбительные подзапросов, безотносительно для существует() п.

Проще говоря, запрос на страхование найдет проблемы в этом случае.

SELECT 
    companyname, 
    count(*) 
FROM 
    insurance 
GROUP BY 
    companyname 
HAVING 
    count(*) > 1 

Также, пожалуйста, сделайте что-нибудь о форматировании кода. Форматирование является бесплатным и позволяет избежать кошмаров. Этот код очень трудно прочитать для следующего человека (который может быть только вам).

+0

Спасибо, я не написал оригинальный запрос. Уберу, соглашусь! Когда я запустил счет, я получаю только 1 в каждом счете имени плательщика, поэтому я запутался? – DDulla

+0

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

+0

Кстати, иногда вы также видите это поведение с преобразованиями типа данных, например CAST() на varchar, в datetime. Даже если ваш последний набор не содержит нарушителей, часто делают промежуточные наборы или отсканированные строки. –

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