Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

bioshock

Estranho (Query) {Resolvido}

Mensagens Recomendadas

bioshock

Estou a ter problemas na query abaixo:

Dim query As String = "SELECT Clientes.* FROM Cliente, Users WHERE Clientes.IDCliente <> Users.IDUser ORDER BY Clientes.IDCliente DESC"

Ou seja, ele esta-me a mostrar todos os valores (portanto não está a fazer efeito o sinal " <> "), e está a repeti-los  :bored:

Se tiver Joaquim como Cliente ele duplica e mete dois Joaquims.

Eu tenho o código semelhante mas com o operador igual ( " = " ) e funciona na perfeição.

http://www.w3schools.com/sql/sql_where.asp

Estive a pesquisar para ter as certezas e o operador está correcto.. :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

However, se eu fizer as seguintes linhas de código:

Try
            ' Connexão com a Base de dados;
            Dim myConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Application.StartupPath & "\BD.mdb"
            ' Criação da query para seleccionar os dados provenientes das tabelas;
           Dim query As String = "SELECT Clientes.* FROM Cliente, Users WHERE Clientes.IDCliente <> Users.IDUser ORDER BY Clientes.IDCliente DESC"
            ' Cria a connexão;
            Dim connection As New OleDbConnection(myConnectionString)
            ' Define os parametros a serem mostrados;
            Dim command As New OleDbCommand(query, connection)
            ' Abre a connexão;
            connection.Open()
            ' Caso obtenha um número, então:
            If command.ExecuteScalar > 0 Then
                MsgBox(command.ExecuteScalar.ToString)
            End If
            ' Fecha a connexão e limpa as variáveis;
            connection.Close()
            connection = Nothing
            command = Nothing
        Catch ex As Exception
            MessageBox.Show(ex.ToString)
        End Try

Na MsgBox aparece-me o valor correcto.

O problema está mesmo na DataGrid..

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

Espanta-me que isso devolva alguma coisa.

Ou muito me engano ou depois do FROM só pode vir uma tabela.

Se quiseres consultar várias terás de o fazer através de JOINS.

E verifica também essa questão plural Cliente/Clientes


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

Eu ali esqueci-me de acrescentar o "ClienteS"

Mas com o exemplo acima ele está a devolver sem problemas na MsgBox o número correcto. Pus a MsgBox e ele detectou qual era o número que pertencia à Tabela Clientes e que era diferente de todos os números da Tabela Users.

Para mostrar na DataGrid, utilizo o código seguinte:

             

 ' Selecciona a Base de Dados;
                Dim BaseDados As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" & My.Application.Info.DirectoryPath & "\GestaoEscolar.mdb';Persist Security Info=True;"
                ' Cria uma nova ligação à base de dados 
                Dim connection As New OleDbConnection(BaseDados)
                ' Cria a query para seleccionar os dados que pretendemos;
                Dim query As String = "SELECT Clientes.* FROM Clientes, Users WHERE Clientes.IDCliente <> Users.IDUser ORDER BY Clientes.IDCliente DESC"
                ' Cria um novo OleDbDataAdapter que servirá para actualizar o DataSet; 
                DataAdapter = New OleDbDataAdapter(query, connection)
                ' Cria um DataSet, ou seja, uma representação em memória da informação; 
                DataSet = New DataSet
                ' Coloca a informação da tabela definida no DataSet; 
                DataAdapter.Fill(DataSet, "Clientes")

                ' Criando automáticamente as colunas e linhas de dados ;
                Me.DataGridView1.DataSource = DataSet.Tables("Clientes")

E ele, para além de me mostrar todos os registos, duplica o único registo que deveria de aparecer quando faço a consulta.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

Continuo a achar que a síntaxe está para lá de errada.

Dá uma vista de olhos por aqui, para construíres uma query que faça sentido.


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

Estive mesmo agora a experimentar essas queries. Mas até agora não me tem dado nada, devolve os mesmos valores.

Edit: Ficou algo como:

Dim query As String = "SELECT Clientes.* FROM Clientes INNER JOIN Users ON Clientes.IDCliente <> Users.IDUser ORDER BY Clientes.IDCliente DESC"

Já experimentei todos os joins, mas sem sucesso.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

Tens de indicar qual é o bind entre as duas tabelas e só depois aplicas condições, caso existam:

SELECT Clientes.* FROM Users INNER JOIN Clientes ON Clientes.IDCliente=Users.IDUser ORDER BY Users.IDUser DESC

Depois, já não estou a perceber exactamente o que queres fazer... explica lá melhor o que pretendes pois acho que há aqui uma confusão.


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

Essa query que fizeste não tem sentido, senão repara:

SELECT column_name(s)
FROM table_name1
INNER JOIN table_name2
ON table_name1.column_name=table_name2.column_name

E tu estás a fazer:

SELECT column_name(s)
FROM table_name2
INNER JOIN table_name1
ON table_name1.column_name=table_name2.column_name

O que eu pretendo, é pegar nos valores que estão na Tabela Clientes mas que não estão na Tabela

Users.

Exemplo:

Tabela Clientes:

ID 1 - Nome: Joaquim

ID 2 - Nome: Alfredo

Tabela Users:

ID 1 = Joaquim

Portanto, o ID 2 da Tabela Clientes não está na Tabela Users, correcto? Pronto, é isso que pretendo, mostrar os registos que não estão na Tabela Users, havendo uma comparação entre o ID Cliente e o ID User.

Simplificando:

SELECT Clientes.* FROM Clientes, Users WHERE Clientes.IDCliente <> (DIFERENTE) Users.IDUser

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

Não interessa se não faz sentido.

O intuito era mostrar-te como devias fazer binds para os Joins.

Agora, o que queres na realidade resume-se à diferença entre duas tabelas.

Queres tudo o que existe numa que não exista em outra.

Não sei se isto é standard, vê lá se o Access papa NOT EXISTS:

SELECT * FROM Clientes WHERE NOT EXISTS (SELECT * FROM Users WHERE Users.IDUser = Clientes.IDCliente)


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

Funcionou perfeitamente.  :)

Eu já havia feito algo como:

SELECT Clientes.* FROM Clientes, Users WHERE NOT Clientes.IDCliente = Users.IDUser ORDER BY Clientes.IDCliente DESC 

Mas sem sucesso.

Não conhecia o "NOT EXISTS (...)", muito porreiro.

Assunto resolvido, obrigado Ribeiro!  :cheesygrin:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.