erro multiple rows in singleton select ao fazer subselect
Estou utilizando o firebird e tentando colocar tudo para exibir em uma linha só e não consigo, tenho duas tabelas:
Gostaria que saísse assim:
ID NOME ANO
1 João 2016, 2015, 2014
2 Maria 2016, 2015
3 José 2015
e aparece a seguinte mensagem: "multiple rows in singleton select", o que fazer no subselect? obrigado!
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
Curtidas 0
Melhor post
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 :
Implemente esta rotina na tua consulta sendo uma subselect.
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
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
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;
endGOSTEI 0