Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.
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...
--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.
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;
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.
Ok
http://forum.imasters.com.br/topic/521760-consulta/
Veja se este tópico ajuda. Solução clássica por divisão.
Outra seria contar os diferentes produtos de uma empresace ver se é igual a quatidade de produtos.