SQL - IN within a SUB SELECT with NOT IN - ORACLE

1

I wanted to make my INSERT dynamic, which does not require me to change the ids manually.

I have this script that returns all PRODUCTS that do not have a relationship with the table EST_PROD_PRECO_CUSTO_EMPRESA

SELECT prod.ID_PRODUTO AS "ID DO PRODUTO" FROM ERP.EST_PRODUTO prod
LEFT JOIN ERP.EST_PROD_PRECO_CUSTO_EMPRESA prodEmp ON prodEmp.ID_PRODUTO = 
prod.ID_PRODUTO
GROUP BY  prod.ID_PRODUTO
HAVING COUNT(prodEmp.ID_PRODUTO) !=83 

My return and 22 data (PRODUCT_ID), made this need another script to return the companies that are not related to these product_ID in the table_PROD_PRECO_CUSTO_EMPRESA. for me to create an insert and make that relationship.

SELECT DISTINCT emp.ID_EMPRESA FROM ERP.CF_EMPRESA emp
WHERE EMP.ID_EMPRESA NOT IN (select emp.id_empresa FROM
ERP.EST_PROD_PRECO_CUSTO_EMPRESA prd
LEFT JOIN ERP.EST_PRODUTO prod ON prod.ID_PRODUTO = prd.ID_PRODUTO
INNER JOIN ERP.CF_EMPRESA emp ON prd.ID_EMPRESA = emp.ID_EMPRESA
WHERE prod.ID_PRODUTO = 127011575) /*id que consegui no script a cima*/

With this return of ID_EMPRESA I create my INSERT. The id I use sequence with a trigger

INSERT INTO EST_PROD_PRECO_CUSTO_EMPRESA ( ID_PRODUTO, ID_EMPRESA,  
    CUSTO_OPERACIONAL, OUTRAS_DESPESAS)
VALUES (127011575, 793, 0, 0)

blz, but when I try to join the sql I have no precise result because it has product that has no relationship with company X, but the other product has no relationship with company Y but has with company X that the other product did not have

SELECT DISTINCT emp.ID_EMPRESA FROM ERP.CF_EMPRESA emp
WHERE EMP.ID_EMPRESA NOT IN 
    (SELECT emp.id_empresa FROM
    ERP.EST_PROD_PRECO_CUSTO_EMPRESA prd
    LEFT JOIN ERP.EST_PRODUTO prod ON prod.ID_PRODUTO = prd.ID_PRODUTO
    INNER JOIN ERP.CF_EMPRESA emp ON prd.ID_EMPRESA = emp.ID_EMPRESA
    WHERE prod.ID_PRODUTO  IN(
     SELECT prod.ID_PRODUTO AS "ID DO PRODUTO" FROM ERP.EST_PRODUTO prod
     LEFT JOIN ERP.EST_PROD_PRECO_CUSTO_EMPRESA prodEmp ON
         prodEmp.ID_PRODUTO = prod.ID_PRODUTO
     GROUP BY  prod.ID_PRODUTO
     HAVING COUNT(prodEmp.ID_PRODUTO) !=83 ))

I do not know how to handle each ID_PRODUCT separately from the list until the end of it, my NOT IN does not differentiate each SELECT sub. Does anyone know a solution even with PL / SQL?

    
asked by anonymous 12.09.2018 / 20:46

1 answer

0

PL / SQL I'm still messing around and that's what I need.

random_uuid () and a function of mine that generate UUID values.

DECLARE 

FOR V_FUNC IN
    (SELECT  prod.ID_PRODUTO FROM ERP.EST_PRODUTO prod
                INNER JOIN ERP.EST_PROD_PRECO_CUSTO_EMPRESA prodEmp on prodEmp.ID_PRODUTO = prod.ID_PRODUTO
                GROUP BY  prod.ID_PRODUTO
                HAVING COUNT(prodEmp.ID_PRODUTO) !=83) 
LOOP

            FOR V_FUNC_EMPRESA IN (SELECT DISTINCT emp.ID_EMPRESA FROM ERP.CF_EMPRESA emp
                                            WHERE EMP.ID_EMPRESA NOT IN (select emp.id_empresa FROM ERP.EST_PROD_PRECO_CUSTO_EMPRESA prd
                                            INNER JOIN ERP.EST_PRODUTO prod ON prod.ID_PRODUTO = prd.ID_PRODUTO
                                            INNER JOIN ERP.CF_EMPRESA emp ON prd.ID_EMPRESA = emp.ID_EMPRESA
                                            WHERE prod.ID_PRODUTO = V_FUNC.ID_PRODUTO)
                                            AND EMP.ID_EMPRESA != 110)

                    LOOP
                         INSERT

                                        INSERT 
                                                    INTO EST_PROD_PRECO_CUSTO_EMPRESA 
                                                            (
                                                                                                    ID_PRODUTO, 
                                                             ID_EMPRESA, CUSTO_OPERACIONAL,
                                                                                         OUTRAS_DESPESAS, 
                                                                    PERCENTUAL_OUTRAS_DESPESAS, 
                                                                                                 PRECO_CUSTO, 
                                                                                     PRECO_CUSTO_FINAL, 
                                                                                     PRECO_CUSTO_MEDIO, 
                                                                                    OTAL_OUTROS_CUSTOS,
                                                                OUTROS_CUSTOS_ULTIMA_ENTRADA,
                                                                                                                UUID, 
                                                                                DATA_ULTIMO_REAJUSTE
                                                            )
                                            VALUES
                                                (
                                                                V_FUNC.ID_PRODUTO, 
                                                                V_FUNC_EMPRESA.ID_EMPRESA, 
                                                                        0,
                                                                        0, 
                                                                        0,
                                                                        0, 
                                                                        0,
                                                                        0,
                                                                        0, 
                                                                        0, 
                                                random_uuid(),
                                                            SYSDATE
                                                )

                                ;

            END LOOP;

END LOOP;

END;
    
12.09.2018 / 22:41