La sous-requête a renvoyé plus d'une valeur. Ceci n'est pas autorisé. Où est l'erreur?

Je reçois l'erreur:

La sous-requête a renvoyé plus d'une valeur. Cela n'est pas autorisé lorsque la sous-requête suit =,! =, <, <=,>,> = Ou lorsque la sous-requête est utilisée comme une expression.

Je suis confus, parce que ça me dit que l'erreur se produit à la ligne 2, je ne vois pas comment c'est possible?

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)) 

Cette ligne

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

Il vous indique que cette sous-requête revient avec plusieurs lignes et qu'elle ne peut pas affecter la valeur de plusieurs lignes à une seule colonne sur une seule ligne.

Les numéros de ligne dans ces erreurs sont souvent sans signification. Il vous donne généralement la position de la déclaration qui a commencé tout, ce qui est probablement sur la ligne 2 dans votre cas.

Changez cela en SELECT afin d'afficher un COUNT () de lignes returnnées par la sous-requête pour chaque ligne de votre table de base. Un ou plusieurs d'entre eux a plus d'un insurance.id renvoyé par votre sous-requête.

Par exemple:

 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) ) 

Voici une version qui isole ces sous-requêtes offensantes, sans égard à la clause exists ().

 select t.* from ( 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 ) AS T where T.payer_name_count > 1 

Plus simplement encore, une question sur l'assurance va find les problèmes dans ce cas.

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

Aussi, s'il vous plaît faites quelque chose au sujet de la mise en forme du code. Le formatting est gratuit, et évite les cauchemars d'entretien. Ce code est très difficile à lire pour la personne suivante (qui pourrait bien être vous).