2016-08-02 98 views
0

我遇到此查询。我想要显示一个名为“执行”的字段,如果加入表'prospectousuario'时没有匹配,就必须说“sin asignar”,如果它存在,则必须说明执行者的名字和姓氏。但它返回以下错误:子查询返回的值超过1,导致查询失败

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

查询是:

select p.IDCANCAP, 
p.CEDULA, 
p.NOMBRES, 
p.APELLIDOS, 
p.CELULAR, 
p.CASA, 
p.CORREO, 
p.ESTABLECIMIENTO, 
c.DESCRIPCION, 
(select case when 
p.CEDULA = pu.IDPROSPECTO and pu.IDUSUARIO = u.CEDULA 
then u.NOMBRES+' '+u.APELLIDOS else 'Sin asignar' 
end from usuario as u, PROSPECTOUSUARIO as pu) as Ejecutivo, 
p.FECHA_CREAC 

from PROSPECTO p, CANALCAPTACION c 
where p.IDCANCAP = c.IDCANAL 
+0

错误消息告诉你**完全**问题是什么,并且在语句中只有一个子查询。 *你的子查询返回多于一行的哪一部分*不清楚? –

+0

您的子查询可能会返回多条记录。你能想出一种方法来限制子查询,使它只返回一条记录吗? –

+0

@TimBiegeleisen我必须返回表'prospectos'的所有记录和一个必须说明分配的执行人员姓名的额外字段。 – Jorge

回答

0

男孩,这是一个猜测,根据您的SQL和大量的字里行间......但给它一个尝试:

select p.IDCANCAP, p.CEDULA, p.NOMBRES, 
    p.APELLIDOS, p.CELULAR,p.CASA, p.CORREO, 
    p.ESTABLECIMIENTO, c.DESCRIPCION, p.FECHA_CREAC, 
    case when exists 
     (Select * from PROSPECTOUSUARIO 
     Where IDPROSPECTO = p.CEDULA) 
     then u.NOMBRES+' '+ u.APELLIDOS 
     else 'Sin asignar' end Ejecutivo 
from PROSPECTO p 
    join CANALCAPTACION c on c.IDCANAL = p.IDCANCAP 
    join usuario u on u.CEDULA = p.CEDULA 
0

正如错误消息说,你的唯一子查询

(select case when 
p.CEDULA = pu.IDPROSPECTO and pu.IDUSUARIO = u.CEDULA 
then u.NOMBRES+' '+u.APELLIDOS else 'Sin asignar' 
end from usuario as u, PROSPECTOUSUARIO as pu) 

返回多于1行,当用作SELECT中的表达式时不允许使用。实际上,upu表似乎没有以任何有意义的方式与任何其他表连接。

要修复,您必须加入的表格。事实上,你甚至不需要为你正在尝试做的子查询 - 将所有表移动到FROM部分并正确连接它们,无论是内部还是外部。不幸的是,我不知道他们应该加入哪些领域,所以如果没有更多的信息或猜测,我就无法帮上忙。

相关问题