SELECT MAX COM VARIAS TABELAS

EABREU 29/04/2013 09:12:27
#422653
Olá.

Estou tentando extrair de 4 tabelas as informações referentes a um código (CodDekafix) mas aparece o erro: Erro de sintaxe (operador faltando) na expressão de consulta.
Segue código:

Private Sub cmdLast_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdLast.Click
Dim Con As New OleDbConnection([Ô]Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\DEKAFIX\Consulta Dekafix\dekafix.mdb[Ô])
Dim cmd As New OleDbCommand()
Con.Open()

sql = [Ô]SELECT * FROM Indice [Ô] _
& [Ô] WHERE CodDekafix=(Select max(CodDekafix) From Indice) [Ô] _
& [Ô]INNER JOIN (((dekafix1 INNER JOIN dekafix2 ON dekafix1.CodDekafix = dekafix2.CodDekafix) [Ô] _
& [Ô]INNER JOIN dekafix3 ON dekafix2.CodDekafix = dekafix3.CodDekafix) [Ô] _
& [Ô]INNER JOIN dekafix1_2L ON dekafix3.CodDekafix = dekafix1_2L.CodDekafix) [Ô] _
& [Ô]ON Indice.CodDekafix = dekafix1.CodDekafix ORDER BY Indice.CodDekafix[Ô]

cmd = New OleDbCommand(sql, Con)

dr = cmd.ExecuteReader


Alguém tem alguma sugestão?

Obrigado

Edson

LLAIA 29/04/2013 11:16:06
#422669
A cláusula WHERE tem que vir depois dos JOINS e o ORDER BY por último. Acho que sua query tá bem zoada, só dei uma ajeitada mas nem sei se funciona e nem sei o que vc quer fazer de fato com esses dados. Espero que tenha ajudado.

   sql = [Ô]SELECT * FROM Indice [Ô] _
& [Ô]INNER JOIN (((dekafix1 INNER JOIN dekafix2 ON dekafix1.CodDekafix = dekafix2.CodDekafix) [Ô] _
& [Ô]INNER JOIN dekafix3 ON dekafix2.CodDekafix = dekafix3.CodDekafix) [Ô] _
& [Ô]INNER JOIN dekafix1_2L ON dekafix3.CodDekafix = dekafix1_2L.CodDekafix) [Ô] _
& [Ô]ON Indice.CodDekafix = dekafix1.CodDekafix [Ô] _
& [Ô]WHERE CodDekafix=(Select max(CodDekafix) From Indice) [Ô] _
& [Ô]ORDER BY Indice.CodDekafix[Ô]
EABREU 29/04/2013 14:02:30
#422681
Obrigado Leandro,

Eu coloquei o codigo sugerido e o retorno foi: [Ô]O campo especificado [ô]CodDekafix[ô] pode se referir a mais de uma tabela relacionada na cláusula FROM da instrução SQL[Ô]


O banco de dados (Access) tem o campo CodDekafix está presente nas 4 tabelas em questão (Indice, dekafix1, dekafix2 e dekafix3) e com o mesmo valor numérico.
Quando eu seleciono o valor contido no campo CodDekafix da tabela Indice, eu pretendo buscar todos os outros valores das outras tabelas com o mesmo valor do CodDekafix. Nessa pesquisa eu quero encontrar o maior valor para esse registro e os valores correspondentes.

Alguma outra sugestão?

Obrigado,
FELLIPEASSIS 30/04/2013 20:00:29
#422760
se vc está usando access ou sqlserver executa sempre sua query no administrador do banco de dados para ver o erro melhor
e o MAX tem que vim antes do FROM
EX:
SELECT
MAX(P.codprod),
MAX(F.codforn),
FROM produto AS P
INNER JOIN fornecedor AS F
ON P.codforn = F.codforn
WHERE P.codprod = 1
ORDER BY P.codprod
EABREU 02/05/2013 08:31:10
#422807
Com a query abaixo eu consigo selecionar todos os dados referentes ao máximo CodDekafix da tabela Indice. Gostaria que com o mesmo CodDekaix, pudesse ler os dados das outras tabela (Dekafix1, Dekafix2 e Dekafix3).

sql = [Ô]Select * From Indice Where CodDekafix=(Select max(CodDekafix) From Indice)[Ô]

Alguma sugestão?

LLAIA 02/05/2013 13:02:59
#422838
Citação:

:
Obrigado Leandro,

Eu coloquei o codigo sugerido e o retorno foi: [Ô]O campo especificado [ô]CodDekafix[ô] pode se referir a mais de uma tabela relacionada na cláusula FROM da instrução SQL[Ô]


O banco de dados (Access) tem o campo CodDekafix está presente nas 4 tabelas em questão (Indice, dekafix1, dekafix2 e dekafix3) e com o mesmo valor numérico.
Quando eu seleciono o valor contido no campo CodDekafix da tabela Indice, eu pretendo buscar todos os outros valores das outras tabelas com o mesmo valor do CodDekafix. Nessa pesquisa eu quero encontrar o maior valor para esse registro e os valores correspondentes.

Alguma outra sugestão?

Obrigado,



Poxa, é só vc na cláusula WHERE indicar o alias de uma tabela, como ocorre na cláusula ORDER BY.

 sql = [Ô]SELECT * FROM Indice [Ô] _
& [Ô]INNER JOIN (((dekafix1 INNER JOIN dekafix2 ON dekafix1.CodDekafix = dekafix2.CodDekafix) [Ô] _
& [Ô]INNER JOIN dekafix3 ON dekafix2.CodDekafix = dekafix3.CodDekafix) [Ô] _
& [Ô]INNER JOIN dekafix1_2L ON dekafix3.CodDekafix = dekafix1_2L.CodDekafix) [Ô] _
& [Ô]ON Indice.CodDekafix = dekafix1.CodDekafix [Ô] _
& [Ô]WHERE Indice.CodDekafix=(Select max(CodDekafix) From Indice) [Ô] _
& [Ô]ORDER BY Indice.CodDekafix[Ô]
EABREU 02/05/2013 13:41:53
#422839
Eu utilizei o código sugerido pelo LLAIA :

sql = [Ô]SELECT * FROM Indice [Ô] _
& [Ô]INNER JOIN (((dekafix1 INNER JOIN dekafix2 ON dekafix1.CodDekafix = dekafix2.CodDekafix) [Ô] _
& [Ô]INNER JOIN dekafix3 ON dekafix2.CodDekafix = dekafix3.CodDekafix) [Ô] _
& [Ô]INNER JOIN dekafix1_2L ON dekafix3.CodDekafix = dekafix1_2L.CodDekafix) [Ô] _
& [Ô]ON Indice.CodDekafix = dekafix1.CodDekafix [Ô] _
& [Ô]WHERE Indice.CodDekafix=(Select max(CodDekafix) From Indice) [Ô] _
& [Ô]ORDER BY Indice.CodDekafix[Ô]


Mas no final da pesquisa o Visual Studio alerta para verificar se o resultado obtido é realmente o último da lista. E não é. O valor correto seria 561 e o programa me retornou 15.


cmd = New OleDbCommand(sql, Con)

dr = cmd.ExecuteReader
If dr.Read() Then
Label11.Text = dr([Ô]CodDekafix[Ô])

Erro : Make sure that the maximum index on a list is less than the list size


Valor da caixa de texto Label11 = 15 ao invés de 591.


EABREU 02/05/2013 14:08:40
#422844
Opa!

Alterei a atribuição da caixa de texto como abaixo e funcionou.


Label11.Text = dr([Ô]Indice.CodDekafix[Ô])


Obrigado.
Faça seu login para responder