Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Ronaldo_Marcos

Relacionar duas tabelas e quantidades de dados diferentes

Recommended Posts

Sem entrar em detalhes, mas basicamente com isso vou diminuir muito o tamanho do meu banco.

 

 

Tabela C:

 

cod_emp nome

001 Loja Nova

 

 

Tabela A:

 

idA nomeproduto

01 Produto01

02 Produto02

03 Produto03

Tabela B:

idB idA cod_emp status

01 02 001 ok

 

 

Eu preciso listar uma empresa com todos os produtos (Tabela A), independente deles estarem na tabela B. Vejam que na Tabela B tenho a empresa 001, ela tem o produto de cod 01 (idA) com status ok.

O resultado que quero seria algo como:
cod_emp idA idB status
001 01 01 ok
001 02 - -
001 03 - -

 

Isto é, mesmo que a empresa 001 não tenha uma correspondencia com algum produto (Tab A) dentro da Tabela B, ele liste de qualquer forma. Eu tentei várias formas de inner, union e por aí vai, mas sempre que faço um 'where =' entre codigos de id da empresa para criar a relacao entre a empresa © e tabela B, eu elimino os outros que não são relacionados.. confuso mesmo, talvez seja por isso que não encontrei uma lógica para conseguir criar uma consulta no sql. Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não consegui, testei várias formas, mas o máximo que consegui foi listar na quantidade dos tipos de produtos (quantidade da tabela A), mas fica repetido os outros campos que deveriam ficar vazios já que não existe correspondencia...

Compartilhar este post


Link para o post
Compartilhar em outros sites

--Produtos por empresa

 

 

Select codemp ,count(distinct ida) qtd

From tabelab

 

 

--produtos totais

 

Select count(*)

From tabelaa

 

--empresas com todos os produtos

 

Select codemp ,count(distinct ida)

From tabelab

Group by codemp

Having count(distinct ida) =(select count(*) from tabelaa)

 

 

Só uma dúvida , faz diferença o ida e o idb !?

Eu preciso listar uma empresa com todos os produtos (T

 

 

Pelo que entendi a questão é resoonder à pergunta acima.

Uma solução , entre outras.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta, depois de uns testes diversos e uma outra solução de tópico (inclusive solução sua) consegui. Eu não podia usar count porque na programação depois daria trabalho demais para fazer manutenção, pois existem outros campos que não citei aqui para não confundir e eu podia tratar isso lá...

Minha dificuldade era a diferença de colunas, achei que não funcionaria, mas estava usando uma sintaxe incorreta para 'colunas virtuais', e por várias vezes o SQL não estava executando e eu achando que fosse erro (uma falha que já percebi na última versão do firefox rodando arquivos locais)

Ficou assim:

select TabelaB.cod_idA, TabelaB.cod_emp, TabelaB.status from TabelaB where TabelaB.cod_emp = 001

union

select TabelaA.idA, '' as cod_emp, '' as status from TabelaA
left join TabelaB
on TabelaB.idA = TabelaA.idA
where TabelaB.cod_emp <> 001

order by idA

 

Ou seja:

- no primeiro select eu pego tudo que tem nas duas com relacionamento;

- no segundo select pego tudo que tem na lista de produtos, exceto (left join) o que está outra / tudo que é diferente do primeiro select, sem relação;

- junto eles com um union;

- e ordeno (necessário para meu caso)

 

obs.: no segundo select usei apostrofos vazios com alias (as) para criar campos 'virtuais' e não dar erro na execução do union (meu erro inicial)... e no order by vejam que não cita o nome da tabela (nomes que devem ser iguais nos dois selects ou o order by 'global' não funciona)..

Assim eu tenho uma lista com todos os produtos por empresa, independente de existir na tabela de produtos ja comprados (os campos ficam null para nao comprados).

Obrigado Motta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.