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

Igor

Responder

Post mais votado

18/01/2019

Olá amigo,

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

Alex William
Responder

Mais Posts

18/01/2019

Igor

Olá amigo,

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);
}
Responder

19/01/2019

Ricardo Pestana

Igor,

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?


Responder

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()";

Responder

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



Responder

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);
}

}

Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar