Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Problema com resultado distintos na junção de tabelas com


Vulcão

Pergunta

Bom dia pessoal! Sou novo no fórum e espero poder contribuir com todos vocês quando necessário. O motivo pelo qual estou procurando ajuda é que já faz um mês que estou quebrando a cabeça com uma consulta de SQL na junção de tabelas com LEFT JOIN/INNER JOIN para um sistema campanha publicitária on-line, já consegui todo resultado do mundo nesta consulta só não consigo o resultado que estou precisando. Eu não sei se é um limitação do Access ou limitação do SQL, só sei que a minha ultima saída é postar neste fórum que é tão conceituado pela sua sabedoria; conseqüência dos esforços de todos os seus membros .

Aparentemente não há nada de errado com a minha consulta, o problema é que preciso gera alguns parâmetros que quando solicito a consulta, ou vem resultado demais ou falta resultado, segue abaixo o código.

Detalhe, eu preciso de resultado distintos

ComandoSQL = "SELECT DISTINCT codCamp, titulo, status, inicio, termino, id_texto, id_regulamento, exibir, id_Campanha, cliente, participar FROM (campanhas Left JOIN campanhas_participantes ON campanhas.CodCamp =campanhas_participantes.id_campanha) WHERE codCamp=id_campanha "

Eu preciso captura da tabela (campanhas_participantes) o id_campanha e o cliente, até ai tudo bem consigo captura só que clausula DISTINCT não funciona, retornando valores duplicados, o seja as campanhas repetidas gravadas de todos os clientes. Se tiro a declaração (cliente) da clausula destinct ai não duplica o resultado, mas também não me dá o numero do cliente gravados na tabela campanha_participantes, gerando o erro abaixo. Como eu resolvo isto, alguém tem alguém idéia?

CodCamp (id da tabela Campanha): 13

id_Campanha (id da Campanha tabela campanha_partincipantes): 13

Erro:

ADODB.Recordset erro '800a0cc1'

O item não pode ser encontrado na coleção correspondente ao nome ou ao ordinal solicitado.

/consultar_campanhas.asp, linha 324

Link para o comentário
Compartilhar em outros sites

16 respostass a esta questão

Posts Recomendados

  • 0

Amigo, numa bre olhada no seu código parece tudo ok, tente pegar essa linha de código e faça uma consulta para testar a integridade dele e em seguida mude para o modo design da consulta para ver o que pode estar errado.

Link para o comentário
Compartilhar em outros sites

  • 0
Amigo, numa bre olhada no seu código parece tudo ok, tente pegar essa linha de código e faça uma consulta para testar a integridade dele e em seguida mude para o modo design da consulta para ver o que pode estar errado.

Meu caro obrigado pela resposta! Então esqueci mencionar que estou usando asp classic que por tanto a consulta esta no modo designer. Mas como dito antes se eu deixo a declaração do campo Cliente, me parece algo como mostrado abaixo da forma que eu preciso, tento todas as informações como mostrado somente como referencia na coluna escrever-se. Só que se tiver mais de cliente com a mesma Campanha teste6, ai duplica a consulta! Pelo que pude ver o meu problema todo esta girando em torno da coluna cliente da tabela campanhas_participantes, que esteja cadastrado na mesma que tenha o código da campanha repetido. Se tiro o campo cliente a consulta ocorre somente na tabelas campanha não me mostrado os campos que preciso.

NOME DA CAMPANHA

Campanha----------------------Data Início----------------------Data Termino------------------------------Escrever-se-------------------------------------Status das Campanhas

Campanha teste6 ________ 13/09/2011 ás 00:00:00 ___ 12/12/2011 ás 00:00:00 ______CodCamp (id da tabela Campanha): 13 ______ Campanha Ativa

________________________________________________________________________id_Campanha (id da Campanha tabela

________________________________________________________________________campanha_partincipantes): 13

________________________________________________________________________ Numero cliente (tabela campanha_partincipantes) 69

Editado por Vulcão
Link para o comentário
Compartilhar em outros sites

  • 0
Usa GROUP BY id_campanha, id_cliente

Meu caro boa noite, obrigado pela resposta! Fiz como você disse, para group by funcionar fui obrigado a declara todos os campos novamente como mostrado abaixo; funcionou só que a consulta continou mostrando dados duplicado. Tentei tbém sem (Where codCamp=id_campanha) o resultado foi o mesmo, e quando deixo declarado somente os dois campos como você disse dá o erro logo abaixo.

Desta forma funciona mas o resultado é o mesmo:

ComandoSQL = "SELECT DISTINCT codCamp, titulo, status, inicio, termino, id_texto, id_regulamento, exibir, id_Campanha, participar, cliente FROM (campanhas Left JOIN campanhas_participantes ON campanhas.CodCamp =campanhas_participantes.id_campanha) WHERE titulo=titulo GROUP BY codCamp, id_campanha, cliente, participar, titulo, status, inicio, termino, id_texto, id_regulamento, exibir "

Erro quando fiz diferente:

Microsoft JET Database Engine erro '80040e21'

Você tentou executar uma consulta que não inclui a expressão 'codCamp' especificada como parte de uma função agregada.

/consultar_campanhas.asp, linha 247

Link para o comentário
Compartilhar em outros sites

  • 0
Eu preciso captura da tabela (campanhas_participantes) o id_campanha e o cliente, até ai tudo bem consigo captura só que clausula DISTINCT não funciona, retornando valores duplicados, o seja as campanhas repetidas gravadas de todos os clientes. Se tiro a declaração (cliente) da clausula destinct ai não duplica o resultado, mas também não me dá o numero do cliente gravados na tabela campanha_participantes, gerando o erro abaixo. Como eu resolvo isto, alguém tem alguém idéia?

na verdade não é duplicacao, se um id_campanha aparece varias vezes na tabela de participantes, vai ter uma linha para cada participante nesse seu select, não tem nd de errado.

exemplo, possivelmente, nesse sua tabela de participante, você não tem somente o cliente 69 para o id 13. você deve ter uma linha para o 69, outra para o 70, outra para o 71 e etc.

então o seu select vai trazer as tres linhas, uma com cada codigo. ai é so você tratar do jeito como achar melhor.

se você quiser pegar só o primeiro cliente, pode tentar assim:

ComandoSQL =  "SELECT codCamp, titulo, status, inicio, termino, id_texto, id_regulamento, exibir, id_Campanha, Min(campanhas_participantes.cliente) As cliente,  participar FROM  (campanhas Left JOIN campanhas_participantes  ON campanhas.CodCamp =campanhas_participantes.id_campanha) Group By codCamp, titulo, status, inicio, termino, id_texto, id_regulamento, exibir, id_Campanha, participar"

mas isso levando em conta q cliente seja o unico campo q vem da tabela campanhas_participantes. se tiverem mais campos e o valor deles varias, ai pode complicar o select.

Link para o comentário
Compartilhar em outros sites

  • 0
Eu preciso captura da tabela (campanhas_participantes) o id_campanha e o cliente, até ai tudo bem consigo captura só que clausula DISTINCT não funciona, retornando valores duplicados, o seja as campanhas repetidas gravadas de todos os clientes. Se tiro a declaração (cliente) da clausula destinct ai não duplica o resultado, mas também não me dá o numero do cliente gravados na tabela campanha_participantes, gerando o erro abaixo. Como eu resolvo isto, alguém tem alguém idéia?

na verdade não é duplicacao, se um id_campanha aparece varias vezes na tabela de participantes, vai ter uma linha para cada participante nesse seu select, não tem nd de errado.

exemplo, possivelmente, nesse sua tabela de participante, você não tem somente o cliente 69 para o id 13. você deve ter uma linha para o 69, outra para o 70, outra para o 71 e etc.

então o seu select vai trazer as tres linhas, uma com cada codigo. ai é so você tratar do jeito como achar melhor.

se você quiser pegar só o primeiro cliente, pode tentar assim:

ComandoSQL =  "SELECT codCamp, titulo, status, inicio, termino, id_texto, id_regulamento, exibir, id_Campanha, Min(campanhas_participantes.cliente) As cliente,  participar FROM  (campanhas Left JOIN campanhas_participantes  ON campanhas.CodCamp =campanhas_participantes.id_campanha) Group By codCamp, titulo, status, inicio, termino, id_texto, id_regulamento, exibir, id_Campanha, participar"

mas isso levando em conta q cliente seja o unico campo q vem da tabela campanhas_participantes. se tiverem mais campos e o valor deles varias, ai pode complicar o select.

Caro Kurio;

Desculpa pela demora em lhe dá um retorno da sua resposta a este Post, os últimos 3 dias estive envolvido em outras questão e só hoje pude voltar a pensar neste assunto, mas vamos lá. Realmente o sistema que estou criando é como você relatou; testando da forma que você indicou usando a função Min() pegando somente o menor cliente da tabela campanhas_participantes funcionou normalmente, consegui fazer toda a consulta que precisava dizendo ao meu script que se session do cliente 69 for igual cliente 69 da tabela campanhas_participantes mostra uma mensagem.

Você já participa desta campanha, se for diferente Cadastre-se. Pois bem, o problema foi como você disse que poderia complica o meu Select porque existe sim vários outros clientes cadastrados na tabela campanhas_participantes, inclusive mais alguns campos que eu não precisava exibir nesta consulta, e se logo usando um outro cliente ex. cliente 70 ai a consulta omite que este cliente já tem campanhas cadastradas. E ai como eu faço neste caso uma vez que a função Min() pega somente o menor cliente e a função Max() pega só o maior cliente? Se uso a clausula WHERE cliente=69 lista somente as campanha que o cliente esta cadastrado impossibilitando que ele cadastre em outras campanha.

E Iceguy, obrigado por perguntar; então respondendo, preciso lista todas as campanhas existentes na tabela Campanhas e ao mesmo tempo pegar as informações do cliente na tabela Campanha_participantes, para não permitir que ele cadastra-se mais de uma vez na mesma campanha.

Editado por Vulcão
Link para o comentário
Compartilhar em outros sites

  • 0
é só colocar uma chave composta pelo cliente + campanha, com isso o banco não deixa entrar cadastro repetido

Iceguy você poderia me dar um exemplo pratico de como criar uma chave composta no access? Procurei na net exemplos e não consegui nada muito concreto, o que mais esclareu algumas duvidas foi o post que encontrei no link abaixo, mesmo assim não entendi muito bem.

http://www.hardware.com.br/comunidade/elim...icacoes/788938/

Link para o comentário
Compartilhar em outros sites

  • 0

Abre a tabela em modo de edição, seleciona os campos que você quer como chave e pressiona o ícone da chave. Caso esteja usando somente o arquivo mdb sem o ACCESS instalado, envie a consulta ALTER TABLE nomeDaTabela ADD PRIMARY KEY (campo1, campo2, campoN)

Link para o comentário
Compartilhar em outros sites

  • 0

Iceguy, tenho o Access instalado, adicionei como chave composta os campos id, id_campanha e cliente da tabela campanhas_participantes só que não funcionou, mesmo porque nesta tabela tenho que permitir dados duplicados, ex. cliente 69 /campanha 13 - cliente 70 / campanha 13 etc. Uma coisa que percebi quando faço a consulta unindo as duas tabelas através de left join, dá entender que as campanhas são listadas da tabelas campanhas_participantes e não das tabela Campanhas, teria como eu listar somente os registros da tabela CAMPANHAS e pegar as referencias que preciso da tabela campanhas_participantes? Ou seja uma consulta inversa!

Se o meu Select ficar assim, consigo listar somente os registros da tabela Campanhas, só que perco a referências dos clientes da tabelas participantes. Ufa parece uma missão impossivel, onde estou errando?

SELECT codCamp, titulo, status, inicio, termino, id_texto, id_regulamento, participar, Cliente FROM (campanhas Left JOIN campanhas_participantes ON campanhas.CodCamp =campanhas_participantes.clientes) Group By codCamp, titulo, status, inicio, termino, id_texto, id_regulamento, participar, exibir, cliente

Link para o comentário
Compartilhar em outros sites

  • 0

Pensa assim:

Um cliente tem uma ou muitas campanhas, pois para cirar cliente ele precisa de no mínimo uma campanha mas se gostar pode ter muitas.

Uma campanha pode ter zero ou muitos clientes, pois você pode fazer a campanha e nenhum cliente se interessar, como ela pode interessar a muitos clientes.

Com isso tenho a tabela campanhas e a tabela clientes (isso a grosso modo, cada uma delas tem outras tabelas vinculadas)

Como é uma assossiação de muitos para muitos, existe a necessidade de uma tabela complementar para fazer a junção das duas, podemos chamar de tabela campanhaDoCliente por exemplo, nela coloco simplesmente cod_campanha e cod_cliente, ambos integrando a chave composta. Desta forma não existem dados duplicados, pois cada cliente só pode ter uma vez cada campanha e cada campanha só pode ter uma vez um cliente.

Imagino que você esteja fazendo um formulário com duas listas e aquele esquema de mover entre eles as campanhas selecionadas. Para o cliente se cadastrar você traz uma lista assim +- com as campanhas que ele pode se inscrever: SELECT cod_campanha FROM tabelaCampanha WHERE campanha NOT IN (SELECT cod_campanha FROM tabelaCampanhaDoCliente WHERE cod_cliente = codDoSeuCliente), dessa forma você tem uma lista das campanhas que aquele cliente não se cadastrou, e na lista com as campanhas já cadastradas você traz só a subselect SELECT cod_campanha FROM tabelaCampanhaDoCliente WHERE cod_cliente = codDoSeuCliente. Cada vez que mover algum campo você dá um requery (ou refresh na página, enfim...)

Link para o comentário
Compartilhar em outros sites

  • 0
Pensa assim:

Um cliente tem uma ou muitas campanhas, pois para cirar cliente ele precisa de no mínimo uma campanha mas se gostar pode ter muitas.

Uma campanha pode ter zero ou muitos clientes, pois você pode fazer a campanha e nenhum cliente se interessar, como ela pode interessar a muitos clientes.

Com isso tenho a tabela campanhas e a tabela clientes (isso a grosso modo, cada uma delas tem outras tabelas vinculadas)

Como é uma assossiação de muitos para muitos, existe a necessidade de uma tabela complementar para fazer a junção das duas, podemos chamar de tabela campanhaDoCliente por exemplo, nela coloco simplesmente cod_campanha e cod_cliente, ambos integrando a chave composta. Desta forma não existem dados duplicados, pois cada cliente só pode ter uma vez cada campanha e cada campanha só pode ter uma vez um cliente.

Imagino que você esteja fazendo um formulário com duas listas e aquele esquema de mover entre eles as campanhas selecionadas. Para o cliente se cadastrar você traz uma lista assim +- com as campanhas que ele pode se inscrever: SELECT cod_campanha FROM tabelaCampanha WHERE campanha NOT IN (SELECT cod_campanha FROM tabelaCampanhaDoCliente WHERE cod_cliente = codDoSeuCliente), dessa forma você tem uma lista das campanhas que aquele cliente não se cadastrou, e na lista com as campanhas já cadastradas você traz só a subselect SELECT cod_campanha FROM tabelaCampanhaDoCliente WHERE cod_cliente = codDoSeuCliente. Cada vez que mover algum campo você dá um requery (ou refresh na página, enfim...)

Meu caro Iceguy, fiz do jeito que você falou e deu certo, muito obrigado por sua ajuda, já estava quase ficando louco com este problema.rsrsrsrs Estou em fase de teste do sistema, aparecendo novidades comunico neste post. Mais um vez muito obrigado a você a aos membros do fórum que me ajudou, espero poder retribuir sempre que puder.

Editado por Vulcão
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...