update with auto relationship

0

I have a table called Category, in it I have the attributes ID, DESCRICAO e ORIGEM , I needed to include another attribute ID_CATEGORIA_PAI , this attribute is an autorelacionamento with the same table. Now I need to get some tuples from this table and enter the ID of the parent category, the daughter categories registered today have the same description of the parent category, but with the ending ".1", ".2" and so on and with the origin "child". Today it looks like this:

CAT_ID | CAT_DESC       | CAT_ORIGEM | CAT_ID_PAI
1      | Categoria A    | Cadastro   | null
2      | Categoria B    | Cadastro   | null
3      | Categoria C    | Cadastro   | null
4      | Categoria A.1  | Filho      | null
5      | Categoria B.1  | Filho      | null
6      | Categoria C.1  | Filho      | null
7      | Categoria A.2  | Filho      | null
8      | Categoria B.2  | Filho      | null
9      | Categoria C.2  | Filho      | null

I need to get the following result:

CAT_ID | CAT_DESC       | CAT_ORIGEM | CAT_ID_PAI
1      | Categoria A    | Cadastro   | null
2      | Categoria B    | Cadastro   | null
3      | Categoria C    | Cadastro   | null
4      | Categoria A.1  | Filho      | 1
5      | Categoria B.1  | Filho      | 2
6      | Categoria C.1  | Filho      | 3
7      | Categoria A.2  | Filho      | 1
8      | Categoria B.2  | Filho      | 2
9      | Categoria C.2  | Filho      | 3

Can anyone tell me if it is possible to do an update script to update these child categories based on the category description and the source?

    
asked by anonymous 12.12.2018 / 12:22

1 answer

2
Considering the expected output example, you need to validate whether the item that will be updated ( CAT_ORIGEM ) is of type "Son" and

if there is one of type "Register" that is your start, type like this:

UPDATE cadastro c
SET CAT_ID_PAI = (SELECT c2.CAT_ID 
                  FROM cadastro c2 
                  WHERE c.CAT_DESC LIKE CONCAT(c2.CAT_DESC, '%')
                    AND c2.CAT_ORIGEM = 'Cadastro'
                  LIMIT 1)
WHERE c.CAT_ORIGEM = 'Filho'

As you did not specify the database, I created this example in mysql ; the query is a little different because I used join , but the idea follows the same:

UPDATE categoria c
JOIN categoria c2 on c.CAT_DESC LIKE CONCAT(c2.CAT_DESC, '%')
SET c.CAT_ID_PAI = c2.CAT_ID
WHERE c.CAT_ORIGEM = 'Filho';
    
12.12.2018 / 12:31