erro multiple rows in singleton select ao fazer subselect

Firebird

07/06/2016

Estou utilizando o firebird e tentando colocar tudo para exibir em uma linha só e não consigo, tenho duas tabelas:

CREATE TABLE PESSOA (ID INTEGER NOT NULL, NOME  VARCHAR(50));
CREATE TABLE FERIAS (ID INTEGER NOT NULL, ID_PESSOA INTEGER, ANO VARCHAR(20));
INSERT INTO PESSOA (ID, NOME) VALUES (1, 'João');
INSERT INTO PESSOA (ID, NOME) VALUES (2, 'Maria');
INSERT INTO PESSOA (ID, NOME) VALUES (3, 'José');
INSERT INTO FERIAS (ID, ID_PESSOA, ANO) VALUES (1, 1, '2016');
INSERT INTO FERIAS (ID, ID_PESSOA, ANO) VALUES (2, 1, '2015');
INSERT INTO FERIAS (ID, ID_PESSOA, ANO) VALUES (3, 1, '2014');
INSERT INTO FERIAS (ID, ID_PESSOA, ANO) VALUES (4, 2, '2016');
INSERT INTO FERIAS (ID, ID_PESSOA, ANO) VALUES (5, 2, '2015');
INSERT INTO FERIAS (ID, ID_PESSOA, ANO)  VALUES (6, 3, '2015');
COMMIT WORK;


Gostaria que saísse assim:
ID NOME ANO
1 João 2016, 2015, 2014
2 Maria 2016, 2015
3 José 2015

SELECT DISTINCT 
 p.id, p.nome,
(select z.ano from ferias z where z.id_pessoa = p.id) as ferias_tiradas
from
  pessoa p left outer join ferias f on p.id = f.id_pessoa


e aparece a seguinte mensagem: "multiple rows in singleton select", o que fazer no subselect? obrigado!
Guilherme Godoy

Guilherme Godoy

Curtidas 0

Melhor post

Miguel Junior

Miguel Junior

07/06/2016

Boa noite, G.Godoy.

Te aconselho a fazer uma stored procedure para tua necessidade . Dê uma olhada neste exemplo abaixo :

create procedure getAno(id_pessoa int)
returns anosFerias varchar(50)
as 
declare variable ano varchar(50)
begin
 anosFerias = ''; 
 for select F.ano 
     from Ferias f
     where F.id_pessoa = :id_pessoa
     into :ano
 do 
  begin
    if (anosFerias = '') then 
      begin
       anosFerias = ano; 
      end
    else
      begin
       anosFerias = anosFerias || ',' || ano; 
      end 
  end
 suspend; 
end


Implemente esta rotina na tua consulta sendo uma subselect.
GOSTEI 1

Mais Respostas

Rafael Bosco

Rafael Bosco

07/06/2016

   
  'SELECT DISTINCT P.ID, P.NOME, F.ANO FROM PESSOA P INNER JOIN FERIAS F ON P.ID = F.IDPESSOA';
   
GOSTEI 0
Guilherme Godoy

Guilherme Godoy

07/06/2016

Obrigado Mike_Pta, deu certo, só precisei corrigir uma linha, vou colocar aqui para quem precisar depois:

create procedure getAno(id_pessoa int)
returns (anosFerias varchar(50),
         ano varchar(50) )
as 

begin
 anosFerias = ''; 
 for select F.ano
     from Ferias f
     where F.id_pessoa = :id_pessoa
     into :ano
 do
  begin
    if (anosFerias = '') then 
      begin
       anosFerias = ano; 
      end
    else
      begin
       anosFerias = anosFerias || ',' || ano; 
      end 
  end
 suspend; 
end
GOSTEI 0
POSTAR