Alguém sabe utilizar a função MAX no UPTADE com um inner join?
18/01/2019
0
String sql = "update tbxerox\\\\n" + "inner join tbservidores on tbxerox.cpf = tbservidores.cpfserv\\\\n" + "set\\\\n" + "valor = (tbservidores.maxcot - tbxerox.qtd_xerox) * (-0.10)\\\\n" + "WHERE (tbxerox.restcota) < 0\\\\n" + "and (tbxerox.qtd_xerox) > 80\\\\n" + "and xerox = (SELECT MAX(xerox) from tbxerox);"; try { pst = conexao.prepareStatement(sql); int adicionado; adicionado = pst.executeUpdate(); } catch (Exception e) { JOptionPane.showMessageDialog(null, e); } }
Emite a seguinte mensagem no Netbeans:
java.sql.SQLException: You can’t specify target table ‘tbxerox’ for update in FROM clause.
Igor
Post mais votado
18/01/2019
Você esta dando um UPDATE em uma tabela e usando ela mesma como critério.
Essa mensagem é do próprio SQL dizendo que ele não permite isso, ou seja, sua QUERY está com erros.
A forma que eu vejo de fazer isso é primeiro dar um select na tabela de xerox para pegar o ultimo e depois guardar esse valor retornado numa variável e fazer o update:
String sqlMax = "SELECT MAX(xerox) from tbxerox;"; try { pst = conexao.prepareStatement(sqlMax ); int maximoXerox; maximoXerox = pst.executeSelect(); String sql = "update tbxerox\\\\\\\\n" + "inner join tbservidores on tbxerox.cpf = tbservidores.cpfserv\\\\\\\\n" + "set\\\\\\\\n" + "valor = (tbservidores.maxcot - tbxerox.qtd_xerox) * (-0.10)\\\\\\\\n" + "WHERE (tbxerox.restcota) < 0\\\\\\\\n" + "and (tbxerox.qtd_xerox) > 80\\\\\\\\n" + "and xerox = "+maximoXerox+";"; int adicionado; adicionado = pst.executeUpdate(); } catch (Exception e) { JOptionPane.showMessageDialog(null, e); } }
Acho que essa é uma forma. Eu fiz um exemplo acima pq não se como são as funções da sua classe.
Espero ter ajudado. :D
Alex William
Mais Posts
18/01/2019
Igor
Você esta dando um UPDATE em uma tabela e usando ela mesma como critério.
Essa mensagem é do próprio SQL dizendo que ele não permite isso, ou seja, sua QUERY está com erros.
A forma que eu vejo de fazer isso é primeiro dar um select na tabela de xerox para pegar o ultimo e depois guardar esse valor retornado numa variável e fazer o update:
String sqlMax = "SELECT MAX(xerox) from tbxerox;"; try { pst = conexao.prepareStatement(sqlMax ); int maximoXerox; maximoXerox = pst.executeSelect(); String sql = "update tbxerox\\\\\\\\\\\\\\\\n" + "inner join tbservidores on tbxerox.cpf = tbservidores.cpfserv\\\\\\\\\\\\\\\\n" + "set\\\\\\\\\\\\\\\\n" + "valor = (tbservidores.maxcot - tbxerox.qtd_xerox) * (-0.10)\\\\\\\\\\\\\\\\n" + "WHERE (tbxerox.restcota) < 0\\\\\\\\\\\\\\\\n" + "and (tbxerox.qtd_xerox) > 80\\\\\\\\\\\\\\\\n" + "and xerox = "+maximoXerox+";"; int adicionado; adicionado = pst.executeUpdate(); } catch (Exception e) { JOptionPane.showMessageDialog(null, e); } }
Acho que essa é uma forma. Eu fiz um exemplo acima pq não se como são as funções da sua classe.
Espero ter ajudado. :D
Poderia colocar o MAX nesse SELECT?
String sql = "select\\n"
+ "X.xerox ,qtd_xerox,valor ,data_s,restcota, \\n"
+ "S.nomeserv ,cpfserv ,tiposerv,maxcot,total_xerox \\n"
+ "from tbxerox as X\\n"
+ "inner join tbservidores as S\\n"
+ "on (X.cpf = S.cpfserv);";
try {
pst = conexao.prepareStatement(sql);
rs = pst.executeQuery();
tblServidores.setModel(DbUtils.resultSetToTableModel(rs));
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
}
19/01/2019
Ricardo Pestana
Ou vc usa somente a função max() no seu select, conforme o Alex respondeu acima ou ela tem que estar com a cláusula "group by".
A forma como o Alex colocou parece ser uma boa solução.... não funcionou?
19/01/2019
Ricardo Pestana
Igor,
Você pode também criar uma função no banco para retornar o ultimo xerox e usá-la diretamente no update...
Testei no mysql e funcionou... é uma alternativa apenas
por exemplo:
CREATE FUNCTION `ultimo_Xerox` ()
RETURNS INTEGER
BEGIN
declare maximo integer default 0;
select max(xerox) into maximo from tbxerox x;
RETURN maximo;
END
String sql = "update tbxerox"
+ "inner join tbservidores on tbxerox.cpf = tbservidores.cpfserv"
+ "set"
+ "valor = (tbservidores.maxcot - tbxerox.qtd_xerox) * (-0.10)"
+ "WHERE (tbxerox.restcota) < 0"
+ "and (tbxerox.qtd_xerox) > 80"
+ "and xerox = ultimo Xerox()";
20/01/2019
Ricardo Pestana
Igor,
Você pode também criar uma função no banco para retornar o ultimo xerox e usá-la diretamente no update...
Testei no mysql e funcionou... é uma alternativa apenas
por exemplo:
CREATE FUNCTION `ultimo_Xerox` ()
RETURNS INTEGER
BEGIN
declare maximo integer default 0;
select max(xerox) into maximo from tbxerox x;
RETURN maximo;
END
String sql = "update tbxerox"
+ "inner join tbservidores on tbxerox.cpf = tbservidores.cpfserv"
+ "set"
+ "valor = (tbservidores.maxcot - tbxerox.qtd_xerox) * (-0.10)"
+ "WHERE (tbxerox.restcota) < 0"
+ "and (tbxerox.qtd_xerox) > 80"
+ "and xerox = ultimo Xerox()";
Igor,
Tava pensando, se optar por criar a função como sugeri anteriormente..... talvez seja mais interessante criar um procedure que já faz a busca pelo ultimo registro e tb o update, mais ou menos assim:
CREATE PROCEDURE `atualizaXerox` ()
BEGIN
declare maximo integer default 0;
select max(x.cpf) into maximo from tbxerox x;
update tbxerox inner join tbservidores on tbxerox.cpf = tbservidores.cpfserv
set valor = (tbservidores.maxcot - tbxerox.qtd_xerox) * (-0.10)
WHERE (tbxerox.restcota) < 0
and (tbxerox.qtd_xerox) > 80
and xerox = +maximoXerox;
END
21/01/2019
Igor
Igor,
Você pode também criar uma função no banco para retornar o ultimo xerox e usá-la diretamente no update...
Testei no mysql e funcionou... é uma alternativa apenas
por exemplo:
CREATE FUNCTION `ultimo_Xerox` ()
RETURNS INTEGER
BEGIN
declare maximo integer default 0;
select max(xerox) into maximo from tbxerox x;
RETURN maximo;
END
String sql = "update tbxerox"
+ "inner join tbservidores on tbxerox.cpf = tbservidores.cpfserv"
+ "set"
+ "valor = (tbservidores.maxcot - tbxerox.qtd_xerox) * (-0.10)"
+ "WHERE (tbxerox.restcota) < 0"
+ "and (tbxerox.qtd_xerox) > 80"
+ "and xerox = ultimo Xerox()";
Igor,
Tava pensando, se optar por criar a função como sugeri anteriormente..... talvez seja mais interessante criar um procedure que já faz a busca pelo ultimo registro e tb o update, mais ou menos assim:
CREATE PROCEDURE `atualizaXerox` ()
BEGIN
declare maximo integer default 0;
select max(x.cpf) into maximo from tbxerox x;
update tbxerox inner join tbservidores on tbxerox.cpf = tbservidores.cpfserv
set valor = (tbservidores.maxcot - tbxerox.qtd_xerox) * (-0.10)
WHERE (tbxerox.restcota) < 0
and (tbxerox.qtd_xerox) > 80
and xerox = +maximoXerox;
END
Deu certo com a função Ricardo! Muito obrigado.
No caso, se eu criar um EVENTO com um UPDATE ele vai atualizar o utimo registro tambem?
Esse EVENTO
CREATE EVENT incrementar ON SCHEDULE EVERY 5 minute DO
UPDATE tbxerox
inner join tbservidores on tbxerox.cpf = tbservidores.cpfserv
SET maxcot = (tbxerox.restcota + 80),
total_xerox = (0)
WHERE (tbxerox.restcota) > 0
and tbservidores.tiposerv = 'Professor';
Executou perfeitamente dentro do prazo de 5 minutos, mas não consigo realizar outra atualização no intervalo de 5 min. Pode ajudar?
Queria realizar executar esse UPDATE
private void uptade_4() {
String sql = "update tbservidores s \\n"
+ "set s.total_xerox = (select sum(x.qtd_xerox) \\n"
+ "from tbxerox x \\n"
+ "where x.cpf = s.cpfserv\\n"
//+ "and xerox = ultimo_Xerox ()\\n"
+ "group by x.cpf \\n"
+ "having sum(x.qtd_xerox) > 0);";
try {
pst = conexao.prepareStatement(sql);
//pst.setString(1, txtCliId.getText());
int executa;
executa = pst.executeUpdate();
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
}
}
Clique aqui para fazer login e interagir na Comunidade :)