Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

Retornar uma tabela com registros não coincidentes

Bom dia!

Estou com uma dificuldade em fazer um load de duas tabelas e retirar apenas os dados que não foram localizados.

Em SQL, o código seria o seguinte:

SELECT TabelaA.* FROM base_1 as Tabela1, base_TabelaB as Tabela2

WHERE Tabela1.numero_contrato <> Tabela2.numero_contrato;

Em prática, quero construir o seguinte resultado:

Tabela A

Número ContratoInformação

Contrato1

A
Contrato2B
Contrato3A
Contrato4A
Contrato5B
Contrato6B
Contrato7C

Tabela B:

Número ContratoInformação
Contrato1A
Contrato5B
Contrato6B
Contrato7C

Tabela Resultado:

Número ContratoInformação
Contrato2B
Contrato3A
Contrato4A

Pesquisei em outros fóruns alguma sintaxe que pudesse me ajudar e não encontrei.

Já tentei colocar tags na hora de left join com "Encontrado" e fazer um load * resident TabelaResultado where tag<>'Encontrado', porém sem sucesso.

Obrigado!

Eduardo Magalhães

Labels (1)
1 Solution

Accepted Solutions
Clever_Anjos
Employee
Employee

Seguindo a recomendação do Luciano Vasconcelos

TEMP1:

LOAD * INLINE [

    Número Contrato, Informação

    Contrato1, A

    Contrato5, B

    Contrato6, B

    Contrato7, C

];

NOCONCATENATE LOAD * INLINE [

    Número Contrato, Informação

    Contrato1, A

    Contrato2, B

    Contrato3, A

    Contrato4, A

    Contrato5, B

    Contrato6, B

    Contrato7, C

]

WHERE NOT Exists([Número Contrato],[Número Contrato]);

DROP Table TEMP1;

View solution in original post

4 Replies
lucianosv
Specialist
Specialist

Bom dia.

É simples.

Você vai primeiro ler a tabela B.

Depois você vai ler  tabela A com a condição Where not exists Número Contrato e drop a tabela B.

Funciona da seguinte maneira: O Where not exists varre os valores de campos já carregados pelo nome do campo.

Segue explicação do help:

Funções Inter-registro

Essas funções são usadas quando um valor dos registros de dados carregados anteriormente é necessário para a avaliação do registro atual.

exists(campo [ , expressão ])

Determina se um valor de campo específico existe em um campo especificado dos dados carregados até o momento. Campo é um nome ou uma expressão de caractere que é avaliada para um nome de campo. O campo deve existir nos dados carregados até o momento pelo script. Expr é uma expressão avaliada para o valor de campo a ser pesquisado no campo especificado. Se for omitido, será assumido o valor do registro atual no campo especificado.

Exemplos:

exists(Mês, 'Jan') retorna -1 (verdadeiro) se o valor de campo 'Jan' puder ser encontrado no conteúdo atual do campo Mês.

exists(IDnr, IDnr) retorna -1 (verdadeiro) se o valor do campo IDnr no registro atual já existir em qualquer registro lido anteriormente naquele campo.

exists (IDnr) é idêntico ao exemplo anterior.

Load Funcionário, ID, Salário from Funcionários.csv;
Load Nome& ' ' &Sobrenome as Funcionário, Comentário from Cidadãos.csv where exists (Funcionário, Nome& ' ' &Sobrenome);
Serão lidos somente os comentários sobre os cidadãos que são funcionários.

Load A, B, C, from Funcionários.csv where not exists (A);
Isso equivale a executar um distinct load no campo A.

nicolett_yuri

Eduardo, você pode fazer isso usando a função NOT Exists.

Segue uma app de exemplo com seus dados de teste

Clever_Anjos
Employee
Employee

Seguindo a recomendação do Luciano Vasconcelos

TEMP1:

LOAD * INLINE [

    Número Contrato, Informação

    Contrato1, A

    Contrato5, B

    Contrato6, B

    Contrato7, C

];

NOCONCATENATE LOAD * INLINE [

    Número Contrato, Informação

    Contrato1, A

    Contrato2, B

    Contrato3, A

    Contrato4, A

    Contrato5, B

    Contrato6, B

    Contrato7, C

]

WHERE NOT Exists([Número Contrato],[Número Contrato]);

DROP Table TEMP1;

Not applicable
Author

Muito obrigado!

Dessa forma consegui fazer a exclusão dos contratos que preciso avaliar!