Há vezes que tenho o mau hábito de complicar o que é fácil e este foi um desses casos. O contexto do problema é o seguinte, tenho as tabelas Principal e Secundary que se relacionam através do campo principalId existente nas duas, e quero alterar um outro campo da tabela Secundary condicionando esse update com base na tabela Principal.
O SQL seguinte dá-me as linhas da tabela Secundary que quero afectar:
O select interior estabelesse a relação e condiciona o resultado com base na tabela Principal (pr1.owner >= 10) e na tabela Secundary (sec2.conditionId = 5). Agora (pensava eu) basta passar o select de fora para update e tenho o resultado que quero:
Acontece um erro porque não posso usar a tabela Secundary no select, o que se formos a ver faz todo o sentido porque estaria a usar um conjunto mutável para condicionar o seu próprio update o que não faz de todo sentido. Simplificando a coisa obtive o seguinte select cujo resultado é igual ao do primeiro:
Passar isto para um update é agora directo:
O SQL seguinte dá-me as linhas da tabela Secundary que quero afectar:
select * from Secundary as sec1
where sec1.principalId in
(select p.principalId from Principal as pr1
inner join Secundary as sec2 on sec2.principalId = pr1.principalId
where pr1.owner >= 10 and sec2.conditionId = 5)
O select interior estabelesse a relação e condiciona o resultado com base na tabela Principal (pr1.owner >= 10) e na tabela Secundary (sec2.conditionId = 5). Agora (pensava eu) basta passar o select de fora para update e tenho o resultado que quero:
update Secundary as sec1
set sec1.conditionId = 1
where sec1.principalId in
(select p.principalid from Principal as pr1
inner join Secundary as sec2 on sec2.principalId = pr1.principalId
where pr1.owner >= 10 and sec2.conditionId = 5)
Acontece um erro porque não posso usar a tabela Secundary no select, o que se formos a ver faz todo o sentido porque estaria a usar um conjunto mutável para condicionar o seu próprio update o que não faz de todo sentido. Simplificando a coisa obtive o seguinte select cujo resultado é igual ao do primeiro:
select * from Secundary as sec1
where sec1.principalId in
(select p.principalid from Principal as pr1
where pr1.owner >= 10 ) and sec1.conditionId = 5
Passar isto para um update é agora directo:
update Secundary as sec1
set sec1.conditionId = 1
where sec1.principalId in
(select p.principalid from Principal as pr1
where pr1.owner >= 10 ) and sec1.conditionId = 5
Usar o IN é conhecido por ser lento. Já testaste usar o EXISTS?
ResponderEliminar