- Este tópico contém 4 respostas, 2 vozes e foi atualizado pela última vez 9 anos, 7 meses atrás por
antognolli.
-
AutorPosts
-
21 de janeiro de 2015 às 10:44 pm #107304
antognolli
ParticipanteSenhores, boa tarde.
Estou com dúvidas em como implementar um algoritmo da melhor forma (buscando rendimento e otimização de código).
Cenário
Tenho vários valores inteiros numa tabela e gostaria de saber qual dos valores somados resultam em determinado número.Ex:
Supondo que eu tenha os seguintes valores na tabela:
1,2,3,4,5,6,7,8Gostaria de saber qual desses valores somados resulta no número 12.
A resposta seria algo como:1+2+3+6 = 12
1+3+8 = 12
1+4+7 = 12
1+5+6 = 12
2+3+7 = 12
2+4+6 = 12
8+4 = 12
6+5+1 = 12
6+4+2 = 12
6+5+1 = 12
7+5 = 12
7+4+1 = 12
7+3+2 = 12
(…)Imaginei trabalhando com cursores… Mas como no ambiente real eu vou ter muito mais informações tenho receio de onerar mto minha rotina. Enfim, alguém pode dar alguma ideia?
*Essa rotina tbm vai ser escrita em SQL SERVER num segundo momento, então quanto menos PL/SQL for utilizado melhor! 🙂
Obrigado…
22 de janeiro de 2015 às 4:28 pm #107307rman
Participante@antognolli
Só por curiosidade, onde será aplicado isso?
Montei o cenário desta forma:
CREATE TABLE NUMEROS(
ID NUMBER
,NUMERO NUMBER
);ALTER TABLE NUMEROS ADD CONSTRAINT PK_NUMEROS PRIMARY KEY(ID);
ALTER TABLE NUMEROS MODIFY NUMERO CONSTRAINT NN_NUMEROS_NUMERO NOT NULL;
INSERT INTO NUMEROS(ID,NUMERO) VALUES(1,1);
INSERT INTO NUMEROS(ID,NUMERO) VALUES(2,2);
INSERT INTO NUMEROS(ID,NUMERO) VALUES(3,3);
INSERT INTO NUMEROS(ID,NUMERO) VALUES(4,4);
INSERT INTO NUMEROS(ID,NUMERO) VALUES(5,5);
INSERT INTO NUMEROS(ID,NUMERO) VALUES(6,6);
INSERT INTO NUMEROS(ID,NUMERO) VALUES(7,7);
INSERT INTO NUMEROS(ID,NUMERO) VALUES(8,8);COMMIT;
SELECT N1.NUMERO X1,N2.NUMERO X2,N3.NUMERO X3,N4.NUMERO X4,N5.NUMERO X5,N6.NUMERO X6,N7.NUMERO X7,N8.NUMERO X8
FROM NUMEROS N1
LEFT JOIN NUMEROS N2 ON N2.NUMERO > N1.NUMERO
LEFT JOIN NUMEROS N3 ON N3.NUMERO > N2.NUMERO
LEFT JOIN NUMEROS N4 ON N4.NUMERO > N3.NUMERO
LEFT JOIN NUMEROS N5 ON N5.NUMERO > N4.NUMERO
LEFT JOIN NUMEROS N6 ON N6.NUMERO > N5.NUMERO
LEFT JOIN NUMEROS N7 ON N7.NUMERO > N6.NUMERO
LEFT JOIN NUMEROS N8 ON N8.NUMERO > N7.NUMERO
WHERE N1.NUMERO+N2.NUMERO+N3.NUMERO+N4.NUMERO+N5.NUMERO+N6.NUMERO+N7.NUMERO+N8.NUMERO = 12UNION
SELECT N1.NUMERO,N2.NUMERO,N3.NUMERO,N4.NUMERO,N5.NUMERO,N6.NUMERO,N7.NUMERO,NULL
FROM NUMEROS N1
LEFT JOIN NUMEROS N2 ON N2.NUMERO > N1.NUMERO
LEFT JOIN NUMEROS N3 ON N3.NUMERO > N2.NUMERO
LEFT JOIN NUMEROS N4 ON N4.NUMERO > N3.NUMERO
LEFT JOIN NUMEROS N5 ON N5.NUMERO > N4.NUMERO
LEFT JOIN NUMEROS N6 ON N6.NUMERO > N5.NUMERO
LEFT JOIN NUMEROS N7 ON N7.NUMERO > N6.NUMERO
WHERE N1.NUMERO+N2.NUMERO+N3.NUMERO+N4.NUMERO+N5.NUMERO+N6.NUMERO+N7.NUMERO = 12UNION
SELECT N1.NUMERO,N2.NUMERO,N3.NUMERO,N4.NUMERO,N5.NUMERO,N6.NUMERO,NULL,NULL
FROM NUMEROS N1
LEFT JOIN NUMEROS N2 ON N2.NUMERO > N1.NUMERO
LEFT JOIN NUMEROS N3 ON N3.NUMERO > N2.NUMERO
LEFT JOIN NUMEROS N4 ON N4.NUMERO > N3.NUMERO
LEFT JOIN NUMEROS N5 ON N5.NUMERO > N4.NUMERO
LEFT JOIN NUMEROS N6 ON N6.NUMERO > N5.NUMERO
LEFT JOIN NUMEROS N7 ON N7.NUMERO > N6.NUMERO
WHERE N1.NUMERO+N2.NUMERO+N3.NUMERO+N4.NUMERO+N5.NUMERO+N6.NUMERO = 12UNION
SELECT N1.NUMERO,N2.NUMERO,N3.NUMERO,N4.NUMERO,N5.NUMERO,NULL,NULL,NULL
FROM NUMEROS N1
LEFT JOIN NUMEROS N2 ON N2.NUMERO > N1.NUMERO
LEFT JOIN NUMEROS N3 ON N3.NUMERO > N2.NUMERO
LEFT JOIN NUMEROS N4 ON N4.NUMERO > N3.NUMERO
LEFT JOIN NUMEROS N5 ON N5.NUMERO > N4.NUMERO
WHERE N1.NUMERO+N2.NUMERO+N3.NUMERO+N4.NUMERO+N5.NUMERO = 12UNION
SELECT N1.NUMERO,N2.NUMERO,N3.NUMERO,N4.NUMERO,NULL,NULL,NULL,NULL
FROM NUMEROS N1
LEFT JOIN NUMEROS N2 ON N2.NUMERO > N1.NUMERO
LEFT JOIN NUMEROS N3 ON N3.NUMERO > N2.NUMERO
LEFT JOIN NUMEROS N4 ON N4.NUMERO > N3.NUMERO
WHERE N1.NUMERO+N2.NUMERO+N3.NUMERO+N4.NUMERO = 12UNION
SELECT N1.NUMERO,N2.NUMERO,N3.NUMERO,NULL,NULL,NULL,NULL,NULL
FROM NUMEROS N1
LEFT JOIN NUMEROS N2 ON N2.NUMERO > N1.NUMERO
LEFT JOIN NUMEROS N3 ON N3.NUMERO > N2.NUMERO
WHERE N1.NUMERO+N2.NUMERO+N3.NUMERO = 12UNION
SELECT N1.NUMERO,N2.NUMERO,NULL,NULL,NULL,NULL,NULL,NULL
FROM NUMEROS N1
LEFT JOIN NUMEROS N2 ON N2.NUMERO > N1.NUMERO
WHERE N1.NUMERO+N2.NUMERO = 12ORDER BY 1,2,3,4,5,6,7,8
A combinação de numeros de 1 a 8 que somados resultam em 12 são 10 :woohoo:
Essa é a ideia. Para tornar isso dinamico, utilize monte o SELECT dinamicamente e execute com EXECUTE IMMEDIATE do PL/SQL
22 de janeiro de 2015 às 7:55 pm #107308antognolli
ParticipanteRMan, boa tarde.
Seu cenário ficou melhor que o meu e diga-se de passagem, mais simples. Parabéns! 😉
Isso vai ser aplicado numa rotina de PCP onde eu tenho uma máquina com determinada capacidade e vários produtos a produzir.
Vou encaixar todas as possibilidades de produção dentro da capacidade de máq.
Ex: Capacidade da maq: 200 metros.
Produto1 = 20 metros
Produto2 = 30 metros
(…)Vou apresentar uma lista com todas as possibilidades de produtos para a capacidade informada.
Eu estava trabalhando com cursores aninhados.
Obrigado pela ajuda! 🙂
22 de janeiro de 2015 às 9:04 pm #107309rman
Participante@antognolli
Agora que você disse que é uma rotina PCP faz sentido.
Fiquei pensando se com cursores aninhados teria um desempenho melhor. Creio que não. Se você implementou compare e poste o resultado.
22 de janeiro de 2015 às 9:17 pm #107310antognolli
ParticipanteRman,
Não terminei de implantar com cursores, pq a manutenção ia ficar muito mais trabalhosa.
Fora que a sua é praticamente uma solução “ANSI”. Implementando com cursores eu teria as particularidades do SQL SERVER e do ORACLE para lidar no futuro.
=)
-
AutorPosts
- Você deve fazer login para responder a este tópico.