Home > Mobile >  Updating all rows using many conditions like "LIKE"
Updating all rows using many conditions like "LIKE"

Time:02-20

Goal:

  • Get "Banco" and "Lançamento" values from TAB_Aditivos_Pagamentos, search for "Descrição" which contains "Lançamento" and "Banco" from TAB_Aditivos_Pagamentos then UPDATE TAB_Aditivos_Pagamentos, settin "TAB_Aditivos_Pagamentos.Descrição = TAB_Movimentos.Descrição" and also "TAB_Aditivos_Pagamentos.Lançamento = TAB_Movimentos.Lançamento"
  • All that ignoring if "Banco" or "Lançamento" is equal 0.

Problems so far:

  1. I'm using "while" to do this task, but it's taking a lot of time, and I'm getting a lot of errors, I think it's possible in SQL to make a single query to fix this, that's why I'm here;
  2. Sometimes there're more than 1 result with same "Banco" in "Descrição" select, my idea was to use a condition like "(DATEDIFF(d, @Date_Tab1, @Date_Tab2) < 7 AND DATEDIFF(d, @Date_Tab2, @Date_Tab1) > -7)", which could solve this problem, or simply gettin Top 1 result;

What I've already done:

DECLARE @Total INT = (SELECT COUNT(1) FROM TAB_Aditivos_Pagamentos)
DECLARE @n INT = 1
DECLARE @sucesso int = 0


WHILE @n <= @Total
BEGIN
    DECLARE @Lanc_PP INT = (SELECT Lançamento FROM (SELECT Row_Number() OVER (Order By ID_Aditivo) As RowNum, * FROM TAB_Aditivos_Pagamentos) t2 WHERE RowNum = @n)
    DECLARE @Banco_PP INT = (SELECT Banco FROM (SELECT Row_Number() OVER (Order By ID_Aditivo) As RowNum, * FROM TAB_Aditivos_Pagamentos) t2 WHERE RowNum = @n)
    DECLARE @Data_PP DATE = (SELECT Data FROM (SELECT Row_Number() OVER (Order By ID_Aditivo) As RowNum, * FROM TAB_Aditivos_Pagamentos) t2 WHERE RowNum = @n)
    DECLARE @ID_Aditivo INT = (SELECT ID_Aditivo FROM (SELECT Row_Number() OVER (Order By ID_Aditivo) As RowNum, * FROM TAB_Aditivos_Pagamentos) t2 WHERE RowNum = @n)

    IF @Banco_PP > 0 AND @Lanc_PP > 0
    BEGIN
    DECLARE @Lanc_MOV INT = (SELECT Lançamento FROM TAB_Movimentos WHERE Descrição LIKE CONCAT('%', REPLACE(STR(@Lanc_PP,6),' ','0'),'%') AND Banco = @Banco_PP)
    DECLARE @Data_MOV DATE = (SELECT Data FROM TAB_Movimentos WHERE Lançamento = @Lanc_PP AND Banco = @Banco_PP)
    DECLARE @Descrição VARCHAR(MAX) = (SELECT Descrição FROM TAB_Movimentos WHERE Lançamento = @Lanc_MOV AND Banco = @Banco_PP)
    UPDATE TAB_Aditivos_Pagamentos SET Lançamento = @Lanc_MOV, Descrição = @Descrição WHERE Lançamento = @Lanc_PP AND Banco = @Banco_PP AND ID_Aditivo = @ID_Aditivo -- AND (DATEDIFF(d, @Data_PP, @Data_MOV) < 7 AND DATEDIFF(d, @Data_PP, @Data_MOV) > -7)
    END
END

A printscreen trying to clarify my problem:

enter image description here

I'm importing a database from another system to mine... That's why "Lançamento" is different in these 2 tables

CodePudding user response:

Loops in SQL are always a bad sign. You should be able to do this in an update with a join.

First, write the select with a join.

select *
from TAB_Aditivos_Pagamentos ap
join TAB_Movimentos m
  on m.Banco = ap.Banco
 and m.Descrição like '%'   ap.Lançamento   '%'

Modify it to get the join where you want it, like removing the duplicates.

Then replace the select with an update.

update ap
set ap.Descrição = m.Descrição, ap.Lançamento = m.Lançamento
from TAB_Aditivos_Pagamentos ap
join TAB_Movimentos m
  on m.Banco = ap.Banco
 and m.Descrição like '%'   ap.Lançamento   '%'
  • Related