Jump to content


Photo

Dúvidas Com Select


  • Faça o login para participar
3 replies to this topic

#1 gui.php

gui.php

    Novato no fórum

  • Usuários
  • 1 posts
  • Sexo:Não informado

Posted 29/08/2007, 01:07

Olá,

Tenho duas tabelas: CTRELCTO (Lançamentos) e CTRELBXA (Baixas). Eu preciso selecionar todos os registros da tabela de Lançamentos que estão ligados na tabela de Baixas, inclusive aqueles registros que NÃO estão na tabela de baixas. Os registros estão ligados entre essas duas tabelas por algumas chaves primárias e a chave que uso é a ID_CTRE. Se fossem 2 Select's, tudo bem, eu consigo a informação que preciso. O problema é que necessito de apenas 1 Select para recuperar estas duas informações. Para simplificar: Preciso saber tudo que está baixado (select * from ctrelcto inner join ctrelbxa) e tudo que não está baixado (select * from ctrelcto not in (select ID_CTRE from ctrelbxa)).

Estes são os dois Selects:


// Sem baixa

SELECT Lancamentos.CR_NUME as Requisicao,
									Lancamentos.CR_PARC as Parcela,
									Lancamentos.CR_DTEM as Emissao,
									Lancamentos.CR_DTVE as Vencimento,
								Sum(Lancamentos.CR_VALO) Over (Partition BY CR_NUME) as Debito
FROM CTRELCTO Lancamentos
INNER JOIN MLDICADT Cadastros ON Lancamentos.ID_CADT = Cadastros.ID_CADT
WHERE Cadastros.CA_CODI = 50
AND Lancamentos.CR_PARC <> 'CHD'
AND Lancamentos.ID_CTRE NOT IN (SELECT ID_CTRE FROM CTRELBXA)

// Com baixa, porém não necessariamente totalmente baixado

SELECT Lancamentos.CR_NUME as Requisicao,
									Lancamentos.CR_PARC as Parcela,
									Lancamentos.CR_DTEM as Emissao,
									Lancamentos.CR_DTVE as Vencimento,
								Sum(Lancamentos.CR_VALO) Over (Partition BY CR_NUME) as Debito,
								Sum(Baixas.CR_VALO) Over (Partition BY CR_NUME) as Credito,
								Sum(Baixas.CR_DESC) Over (Partition BY CR_NUME) as Desconto
FROM CTRELBXA Baixas
INNER JOIN CTRELCTO Lancamentos ON Baixas.ID_CTRE = Lancamentos.ID_CTRE
INNER JOIN MLDICADT Cadastros ON Lancamentos.ID_CADT = Cadastros.ID_CADT
AND Baixas.ID_EMPR = Cadastros.ID_EMPR
AND Lancamentos.CR_PARC <> 'CHD'
AND Cadastros.CA_CODI = 50

E esse é o Select que preciso. Tentei unificar, mas não tive bons resultados. Ficou de fora tudo não tem baixa:


// Abertas e baixadas totalmente ou parcialmente

SELECT DISTINCT Lancamentos.CR_NUME as Requisicao,
									Lancamentos.CR_PARC as Parcela,
									Lancamentos.CR_DTEM as Emissao,
									Lancamentos.CR_DTVE as Vencimento,
								Sum(Lancamentos.CR_VALO) Over (Partition BY CR_NUME) as Debito,
								Sum(Baixas.CR_VALO) Over (Partition BY CR_NUME) as Credito,
								Sum(Baixas.CR_DESC) Over (Partition BY CR_NUME) as Desconto
					FROM CTRELBXA Baixas
					INNER JOIN CTRELCTO Lancamentos ON Baixas.ID_CTRE = Lancamentos.ID_CTRE
					INNER JOIN MLDICADT Cadastros ON Lancamentos.ID_CADT = Cadastros.ID_CADT
					WHERE Baixas.ID_EMPR = Cadastros.ID_EMPR
					AND Lancamentos.CR_PARC <> 'CHD'
					AND Cadastros.CA_CODI = 50
					AND Lancamentos.CR_DTVE = to_date('21/09/2007','dd/mm/yyyy')
					AND EXISTS (SELECT ID_CTRE FROM CTRELCTO) 
					OR Lancamentos.ID_CTRE NOT IN (SELECT ID_CTRE FROM CTRELBXA)

Qual a melhor maneira para se fazer isso? Como ficaria o Select que preciso?

Muito obrigado,

#2 boirock

boirock

    Tecnologia para todos (agora hexa campeão)

  • Usuários
  • 1559 posts
  • Sexo:Masculino
  • Localidade:Curitiba - PR
  • Interesses:PostgreSQL - PHP

Posted 29/08/2007, 13:23

Pelo que eu entendi, o que você quer é selecionar todos os lançamentos, independente de terem baixa ou não, com suas respectivas baixas (Se houver).
Nesse caso, faça o FROM pela tabela de lançamentos com um JOIN na tabela de baixas...
Mas use o LEFT JOIN ao invés do INNER JOIN.
Quando você usa o INNER JOIN, ele só pega os registros quando a condição do JOIN for TRUE.
Se vocÊ usart o LEFT JOIN, vai trazer o registro de qualquer maneira, mas se a condição do JOIN retornar FALSE, os campos da tabela relacionada serão NULL.

É isso ou entendi mal?

[] Rafael :boxing:

#3 Felipe Pena

Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Ex-Admins
  • 6441 posts
  • Sexo:Masculino

Posted 30/08/2007, 15:46

Eu só vejo solução com UNION, as 2 queries tem diferentes propósitos.
Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29

#4 Fr0ZeN

Fr0ZeN

    12 Horas

  • Usuários
  • 124 posts
  • Sexo:Não informado

Posted 17/09/2007, 17:48

se o Eclesiastes falou, está certo! rs

Edição feita por: Fr0ZeN, 17/09/2007, 17:49.





0 user(s) are reading this topic

0 membro(s), 0 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq