Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Anaamelia

Not Exists

Recommended Posts

deve haver algum relacionamente entre elas

 

exemplo

 

SELECT *

FROM CLIENTES C

WHERE NOT EXISTS (SELECT NULL

FROM COMPRAS O

WHERE O.CODCLI = C.CODCLI)

 

RETORNA CLIENTES SEM COMPRAS

OU SEJA VERIFICA SE A SUBQUERY TEM ALGUM RESULTADO

 

VOCE PODE ATÉ OTIMIZAR ...

 

SELECT *

FROM CLIENTES C

WHERE NOT EXISTS (SELECT NULL

FROM COMPRAS O

WHERE O.CODCLI = C.CODCLI

AND ROWNUM = 1)

 

BASTA UM REGISTRO POIS SE TESTE A EXISTENCIA OU NAO

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola,

Tb existem outras formas de fazer oq você esta querendo...

vou mandar 1 a mais...

 

select * from CLIENTES where CODCLI in

(SELECT CODCLI FROM CLIENTES

minus

SELECT CODCLI FROM COMPRAS);

 

Esse mostra clientes sem compras,

como o MINUS e mais rapido q o NOT IN so deixei um exemplo com o MINUS mesmo.

Ai você ve de acordo com as suas necessidades os campos do SELECT.

 

OBS: Com esse comando MINUS, todos os tipos do campo dos SELECT´s tem que ser iguais, como VARCHAR, CHAR, DATE, etc...

 

espero q ter ajudado.

 

http://forum.imasters.com.br/public/style_emoticons/default/bye1.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu preciso restringir alguns campos da tabelaC, teria algum problema?

 

 

deve haver algum relacionamente entre elas

 

exemplo

 

SELECT *

FROM    CLIENTES C

WHERE  NOT EXISTS (SELECT NULL

                                FROM COMPRAS O

                                WHERE O.CODCLI = C.CODCLI)

 

RETORNA CLIENTES SEM COMPRAS

OU SEJA VERIFICA SE A SUBQUERY TEM ALGUM RESULTADO

 

VOCE PODE ATÉ OTIMIZAR ...

 

SELECT *

FROM    CLIENTES C

WHERE  NOT EXISTS (SELECT NULL

                                FROM COMPRAS O

                                WHERE O.CODCLI = C.CODCLI

                                AND ROWNUM = 1)

 

BASTA UM REGISTRO POIS SE TESTE A EXISTENCIA OU NAO

<{POST_SNAPBACK}>

Compartilhar este post


Link para o post
Compartilhar em outros sites

select * from CLIENTES where CODCLI in(SELECT CODCLI FROM CLIENTES minusSELECT CODCLI FROM COMPRAS);Ao utilizar o Minus, está dando a mensagem Too Many Values e eu não xonsigo executar a minha query...As tabelas não possuem os mesmos campos e na 1 tabela eu preciso restringir alguns campos.....Além disso, os campo não são iguais... alguns são varchar na tabela 1 mas são char na tabela 2...Como posso fazer isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

SUPONDO ESTE EXEMPLO QUE DEI ,MAS ...

 

CLIENTES DO RIO E QUE NAO COMPRARAM ACIMA DE 100$

 

SELECT *
FROM    CLIENTES C
WHERE  C.UF = 'RJ'
AND      NOT EXISTS (SELECT NULL
                                FROM    COMPRAS X
                                WHERE  X.CODCLI = C.CODCLI
                                AND      X.VALOR >= 100)

select * from CLIENTES where CODCLI in
         (SELECT CODCLI FROM CLIENTES 
          minus
          SELECT distinct CODCLI FROM COMPRAS);

deveria funcionar , funcionou até em tabelas parecidas num teste que fiz aqui.

se você está em pl-sql o selct só pode retornar 1 linha, senão você deve criar um cursor

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema é que os campos não são do mesmo tipo. Ex.: na tabela A o campo nome é varchar2(10) e na tabela B o campo nome é char(10). Eu não consigo usar o Minus dessa forma...

 

Ana.

 

 

 

 

SUPONDO ESTE EXEMPLO QUE DEI ,MAS ...

 

CLIENTES DO RIO E QUE NAO COMPRARAM ACIMA DE 100$

 

SELECT *FROM    CLIENTES CWHERE  C.UF = 'RJ'AND      NOT EXISTS (SELECT NULL                                FROM    COMPRAS X                                WHERE  X.CODCLI = C.CODCLI                                AND      X.VALOR >= 100)
select * from CLIENTES where CODCLI in         (SELECT CODCLI FROM CLIENTES           minus          SELECT distinct CODCLI FROM COMPRAS);
deveria funcionar , funcionou até em tabelas parecidas num teste que fiz aqui.

se você está em pl-sql o selct só pode retornar 1 linha, senão você deve criar um cursor

<{POST_SNAPBACK}>

Compartilhar este post


Link para o post
Compartilhar em outros sites

agora é bico ...

 

tente um lpad no varchar2 ...

 

lpad(nome,10,' ') ..../

Compartilhar este post


Link para o post
Compartilhar em outros sites

Montilla,Segue abaixo o solicitado:TabelaA campoA NOT NULL DATE campoB CHAR(2) campoC NOT NULL CHAR(12) campoD NOT NULL DATE campoE NOT NULL NUMBER(2) campoF NOT NULL VARCHAR2(50) campoG NOT NULL CHAR(2) campoH NOT NULL NUMBER(2) campoI NOT NULL NUMBER(5)Tabela B campoA NOT NULL DATE campoB NOT NULL CHAR(2) campoC NOT NULL CHAR(12) campoD NOT NULL DATE campoE NOT NULL NUMBER(5) campoF NOT NULL CHAR(16) campoG NOT NULL CHAR(2) campoH NOT NULL NUMBER(5) campoI NOT NULL NUMBER(5)Preciso buscar os dados que estão na tabela A e que não estão na tabela B.Estamos fazendo da seguinte forma:select campoC from tabelaAwhere campoG<>'01' and campoE <> 20 AND NOT (campoG <> '04' and campoE = 99) and trunc(campoD) >= to_date('31/05/2005 00:00:00','DD-MM-YYYY HH24:MI:SS') and trunc(campoD) <= to_date('31/05/2005 23:59:59','DD-MM-YYYY HH24:MI:SS') and campoC in (select campoC from tabelaAminusselect campoC from TabelaB@instancia)Campos que se relacionam: A.campoC = B.campoC A.campoF = B.campoF A.campoG = B.campoG A.campoD = B.campoD A.campoA = B.campoAObrigada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

parece estar correto.

 

tabela a tem mais campos que a tabela b ?

 

tabela b tem mais de uma ocorrencia do campo c ?

 

quais as chaves ?

 

tente

 

select distinct campoC from tabelaA

where campoG<>'01' and campoE <> 20

AND NOT (campoG <> '04' and campoE = 99)

and trunc(campoD) >= to_date('31/05/2005 00:00:00','DD-MM-YYYY HH24:MI:SS')

and trunc(campoD) <= to_date('31/05/2005 23:59:59','DD-MM-YYYY HH24:MI:SS')

minus

select distinct campoC from TabelaB@instancia)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ana,

 

Tenta fazer o seguinte, lista tudo que existe igual nas 2 tabelas, vou te mandar o comando, ai você verifica se nao existem dados iguais mesmo ou se e pq existem alguma problema na SQL, ai você manda pra agente resolver. Ai vai:

 

 

select campoC from tabelaA

where campoG<>'01' and campoE <> 20

AND NOT (campoG <> '04' and campoE = 99)

and trunc(campoD) >= to_date('31/05/2005 00:00:00','DD-MM-YYYY HH24:MI:SS')

and trunc(campoD) <= to_date('31/05/2005 23:59:59','DD-MM-YYYY

H24:MI:SS')

INTERSECT

select campoC from TabelaB@instancia;

 

 

Tow esperando

 

http://forum.imasters.com.br/public/style_emoticons/default/assobiando.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.