 |
ActiveDelphi .: O site do programador Delphi! :.
|
| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
MacacoLoco Novato


Registrado: Terça-Feira, 7 de Julho de 2015 Mensagens: 55
|
Enviada: Sex Fev 23, 2018 7:13 pm Assunto: Concatenar tudo de uma tabela com outra,salvar numa terceira |
|
|
Pessoal, estou usando Firebird 2.5, e tentando pensar em uma forma de relacionar cada DESCRIÇÃO da TAB_LETRA com cada DESCRIÇÃO da TAB_NUMERO, como no exemplo abaixo, cruzar as informações e retornar isto em uma única linha para inserir em outra tabela:
| Código: | TAB_LETRA(id, descri)
1 - A
2 - B
3 - C |
e
| Código: | TAB_NUMERO(id,descri)
1 - 1
2 - 2
3 - 3 |
De forma que para o exemplo acima, me venha:
| Código: | dados retornados pelo sql:
A1
A2
A3
B1
B2
B3
C1
C2
C3 |
Selecionar todos é facil, contar quantos é facil, mas na hora de "juntar" a descrição (A) da tabela TAB_LETRA com as três descrições da tabela TAB_NUMERO(ou quantos houver), fazendo isto para cada uma, ai que não consegui encontrar uma forma até agora. Join não dá, não há relação entre eles.
Editado pela última vez por MacacoLoco em Sex Mar 02, 2018 6:44 pm, num total de 3 vezes |
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Sáb Fev 24, 2018 4:40 pm Assunto: |
|
|
Boa tarde,
Experimente fazer uns testes dessa forma:
| Código: | select l.descri || n.descri
from Tab_Letra as l
cross join Tab_Numero as n |
Espero que ajude
Editado pela última vez por imex em Ter Out 03, 2023 2:50 pm, num total de 1 vez |
|
| Voltar ao Topo |
|
 |
MacacoLoco Novato


Registrado: Terça-Feira, 7 de Julho de 2015 Mensagens: 55
|
Enviada: Sáb Fev 24, 2018 6:02 pm Assunto: |
|
|
Caramba, era isso mesmo. Havia me esquecido do cross join, o join sem clausula on. Resolveu. Valeu Imex.
| imex escreveu: | Boa tarde,
Experimente fazer uns testes dessa forma:
| Código: | select l.descri || n.descri
from Tab_Letra as l
cross join Tab_Numero as n |
Espero que ajude
|
|
|
| Voltar ao Topo |
|
 |
MacacoLoco Novato


Registrado: Terça-Feira, 7 de Julho de 2015 Mensagens: 55
|
Enviada: Sex Mar 02, 2018 6:30 pm Assunto: |
|
|
Bom, consegui cruzar tudo da TAB_LETRA com TAB_NUMERO, mas ainda preciso montar um sql eu cruze tudo que ha na TAB_LETRA com tudo que ha na TAB_NUMERO,
e se houver um produto cadastro na TAB_RELACAO, traga este cadastro informando sua quantidade,
mas se não houver(ou seja, produto ainda não cadastrado na tab_relacao), exiba 0 (zero).
O que eu consegui, esta repetindo (cruzando) as linhas da TAB_RELACAO com TAB_NUMERO e TAB_LETRA,
mas prciso que traga apenas uma vez, limitado apenas ao cruzamento da LETRA com NUMERO, e preenchendo com o ID do produto (indicado ao final do sql) e com a Quantidade.
* O RIGHT JOINT TAB_PRODUTO foi necessário pois pode ter um PRODUTO ainda não cadastrado na TAB_RELACAO. Mas se houver dois cadastros do MESMO produto na tab_relacao, com letra e/ou numero diferente, ele cruza isto no CROSS JOIN da TAB_LETRA e TAB_NUMERO e retorna duas vezes (uma para cada cadastro).
* Eu preciso manter o FROM na TAB_RELACAO pois é nela que vou salvar (quantidade e IDs), mas se bem que eu eu der um select, cast, etc, não salva(estou usando clientdataset), mas dai em diante dou um jeito(um update separado no que já estiver cadastrado, e um insert no que aind anão estiver, quando estiver no beforepost, etc)
Considerando:
| Código: | TAB_LETRA(id, descri)
1 - A
2 - B
3 - C |
| Código: | TAB_NUMERO(id,descri)
1 - 1
2 - 2
3 - 3 |
| Código: | TAB_PRODUTO(id,descri)
1 - PRODUTO UM
2 - PRODUTO SEGUNDO
3 - PRODUTO TRES |
| Código: | //numero_id, letra_id e produto_id são fk da TAB_NUMERO,TAB_LETRA e TAB_PRODUTO respectivamente
TAB_RELACAO(id,produto_id,numero_id,letra_id,qtd)
1 - 1,3,1,17
2 - 1,2,3,5 |
Meu sql até agora:
| Código: | SELECT
P.DESCRI as DESCRI_PRODUTO,P.ID,
(SELECT G.ID FROM TB_RELACAO G WHERE G.LETRA_ID=C.ID AND G.NUMERO_ID=T.ID AND G.PRODUTO_ID=P.ID),
(SELECT G.VALOR_COMPRA FROM TB_RELACAO G WHERE G.LETRA_ID=C.ID AND G.NUMERO_ID=T.ID AND G.PRODUTO_ID=P.ID),
(SELECT G.VALOR_VENDA FROM TB_RELACAO G WHERE G.LETRA_ID=C.ID AND G.NUMERO_ID=T.ID AND G.PRODUTO_ID=P.ID),
(CAST(COALESCE((SELECT X.QTD FROM TB_RELACAO X WHERE X.LETRA_ID=C.ID AND X.NUMERO_ID=T.ID AND X.PRODUTO_ID=P.ID),0) as NUMERIC(18,4))) as QTD,
C.ID as ID_COR,C.DESCRICAO as DESCRI_COR,
T.ID as ID_TAM,T.DESCRICAO as DESCRI_TAM,
FROM
TB_RELACAO G
RIGHT JOIN TB_PRODUTO P on (P.ID=G.PRODUTO_ID)
CROSS JOIN TAB_NUMERO T
CROSS JOIN TAB_LETRA C
WHERE P.ID=1/*id do PRODUTO UM*/
ORDER BY T.ID |
Detesto não conseguir quando eu sei que há uma forma.  |
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Sáb Mar 03, 2018 11:18 am Assunto: |
|
|
Você quer que a query retorne todas as combinações de letras e números com todos os produtos existentes, e quando houver os dados da Tab_Relacao?
Experimente fazer uns testes dessa forma para ver se é obtido o resultado esperado:
| Código: | with
CTE_LetraNum as
(
select
l.Id as Letra_Id,
l.Descri as Letra_Descri,
n.Id as Numero_Id,
n.descri as Numero_Descri
from Tab_Letra as l
cross join Tab_Numero as n
)
select
p.Descri as Descri_Produto,
p.Id,
r.Id,
r.Valor_Compra,
r.Valor_Venda,
cast(coalesce(r.Qtd, 0) as numeric(18, 4)) as Qtd,
ln.Letra_Id,
ln.Letra_Descri,
ln.Numero_Id,
ln.Numero_Descri
from CTE_LetraNum as ln
cross join Tb_Produto as p
left join Tb_Relacao as r
on r.Letra_Id = ln.Letra_Id and
r.Numero_Id = ln.Numero_Id and
r.Produto_Id = p.Id |
obs: você pode utilizar o parâmetro TableName do evento OnGetTableName do DataSetProvider para configurar o nome da tabela a ser utilizado nas atualizações do banco de dados
Espero que ajude |
|
| Voltar ao Topo |
|
 |
MacacoLoco Novato


Registrado: Terça-Feira, 7 de Julho de 2015 Mensagens: 55
|
Enviada: Seg Mar 05, 2018 5:34 pm Assunto: |
|
|
Caramba, era exatamente este resultado que eu desejava, só não tinha idéia de como fazer, você conhece sql demais.
Quanto ao cds, não grava mas é normal: não mandei dar append, e estes valores (25 linhas acima, 5 letras x 5 numeros) não estão (ou podem não estar ainda) na tabela TAB_RELACAO ainda. Mas isto é fácil, conto quantas linhas, faço algo como um "for" mando um update (se tiver id, ou seja, já tá gravado na tb_relacao e será atualizado) ou um append, insert e post (se nao tiver ID, ou seja, não tá gravado na tb_relacao).
Obrigado imex. |
|
| Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|