Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Problemas com tabelas temporarias e NULL


RSalvador

Pergunta

Ola

Estou tentando resolver um problema simples, mas essencial para o proseguimento dos meus trabalhos.

Trabalho, neste caso, com duas tabelas: `clientes` e `notafisc`. Preciso encontrar os clientes registrados para os quais não há nenhuma nota fiscal relacionada.

Podem haver meio mais faceis, mas encontrei dois problemas que me intrigaram:

- Quando tentei resolver a questao utilizando tabelas temporarias, o SQL simplesmente não reconheceu o comando. não guardei o retorno exato, mas meu comando foi

CREATE TABLE #Temp (codigo INT(3) NOT NULL, nota VARCHAR(8) NULL)
INSERT INTO #Temp (codigo, nota) (...
E, ao retornar, foi acusado um erro de sintaxe na linha CREATE TABLE INSERT INTO ..., passando por cima da minha declaracao; - Com este reves, resolvi criar uma tabela e depois joga-la fora manualmente. Consegui criar tranquilamente. Como esperado, o cliente 19, entre outros, tinha o campo nota como NULL. Ao executar o comando
SELECT * FROM Temp WHERE nota=NULL;

o SQL não retorna nenhum resultado.

Poderiam me explicar o que acontece ai? Se cometi algum equivoco, se o SQL não executa o que eu quero, ...?

Obrigado

Editado por Denis Courcy
Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Oi, 'RSalvador'!

Primeiro problema

Trabalho, neste caso, com duas tabelas: `clientes` e `notafisc`. Preciso encontrar os clientes registrados para os quais não há nenhuma nota fiscal relacionada.

A solução é:
SELECT * 
FROM clientes
WHERE idcliente NOT IN (SELECT DISTINCT idcliente FROM notafisc);
Segundo Problema
- Quando tentei resolver a questao utilizando tabelas temporarias, o SQL simplesmente não reconheceu o comando. não guardei o retorno exato, mas meu comando foi
CREATE TABLE #Temp (codigo INT(3) NOT NULL, nota VARCHAR(8) NULL)
INSERT INTO #Temp (codigo, nota) (...
E, ao retornar, foi acusado um erro de sintaxe na linha CREATE TABLE INSERT INTO ..., passando por cima da minha declaracao;
Você esqueceu de separar os comandos CREATE TABLE e INSERT com ponto-e-virgula. Para que ao criar a tabela os dados fossem carregados automaticamente, você deveria usar conforme o exemplo abaixo(extraido do manual do MySQL)
CREATE TABLE artists_and_works
SELECT artist.name, COUNT(work.artist_id) AS number_of_works
FROM artist LEFT JOIN work ON artist.id = work.artist_id
GROUP BY artist.id;
Terceiro Problema
- Com este reves, resolvi criar uma tabela e depois joga-la fora manualmente. Consegui criar tranquilamente. Como esperado, o cliente 19, entre outros, tinha o campo nota como NULL. Ao executar o comando
SELECT * FROM Temp WHERE nota=NULL;
o SQL não retorna nenhum resultado.
Você usou a comparação de forma errada. para comparar se uma variável é nula use IS NULL, conforme o exemplo abaixo:
SELECT * FROM Temp WHERE nota IS NULL;

Link para o comentário
Compartilhar em outros sites

  • 0

Denis, muito obrigado pela resposta.

O primeiro problema foi resolvido. Como eu havia mencionado, sabia que poderia existir outra solucao, mas queria respostas para os problemas que encontrei.

No segundo problema, entendi perfeitamente seu ponto, mas não resolveu o problema das tabelas temporarias. Vou exemplificar: O comando que criei foi

CREATE TABLE #Temp 
SELECT * FROM clientes
LEFT JOIN notafisc ON clientes.id = notafisc.id;
E o SQL acusou erro de sintaxe, retornando o comando da seguinte forma:
CREATE TABLE 
SELECT * FROM clientes
LEFT JOIN notafisc ON clientes.id= notafisc.id;

Note como o #Temp não aparece no comando retornado. Imagino que seja um erro primario, pois nunca precisei implementar tabelas temporarias, tento pela primeira vez.

O terceiro problema tambem foi resolvido. Vale para não cometer mais distracoes como essa.

Mais uma vez, obrigado

Rodrigo Salvador

Editado por RSalvador
Link para o comentário
Compartilhar em outros sites

  • 0

Oi, 'RSalvador',

No segundo problema, entendi perfeitamente seu ponto, mas não resolveu o problema das tabelas temporarias. Vou exemplificar: O comando que criei foi

CREATE TABLE #Temp 
SELECT * FROM clientes
LEFT JOIN notafisc ON clientes.id = notafisc.id;
E o SQL acusou erro de sintaxe, retornando o comando da seguinte forma:
CREATE TABLE 
SELECT * FROM clientes
LEFT JOIN notafisc ON clientes.id= notafisc.id;
Note como o #Temp não aparece no comando retornado. Imagino que seja um erro primario, pois nunca precisei implementar tabelas temporarias, tento pela primeira vez.
A criação de tabelas temporárias segue a sintaxe abaixo:
CREATE TEMPORARY TABLE temp (
<sua definição de atributos e indices>
)ENGINE= MEMORY;
O engine Memory força a criação em memória se a quantidade de registros ultrapassar um limite previamente estabelecido pelo MySQL ele descarrega em disco. Usando seu exemplo, teremos:
CREATE TEMPORARY TABLE  temp
SELECT * FROM clientes
LEFT JOIN notafisc ON clientes.id= notafisc.id;
Neste caso ele vai usar a definição de atributos retornados pelo * do relacionamento entre as duas tabelas. Se existir mesmo nome de campo em ambas as tebelas o MySQL retornará um erro ou criará um nome qualquer para representar o campo. Para evitar este erro use:
CREATE TEMPORARY TABLE  temp (campo1 <tipo-tamanho>, campo2 <tipo_tamanho>,..., campoN <tipo-tamanho>)
SELECT campo1, campo2, ..., campoN FROM clientes
LEFT JOIN notafisc ON clientes.id= notafisc.id;

Link para o comentário
Compartilhar em outros sites

  • 0

Denis, agora esta tudo ok.

Encontrei paginas na internet ensinando o uso do # para tabelas temporarias, mas não surtiu efeito, inclusive gerando os erros que apresentei. O modo que voce colocou no utlimo post resolveu perfeitamente o problema. Tanto que, ao implementar este comando, obtive o mesmo resultado do primeiro comando que voce mesmo passou, no qual não utilizou as tabelas temporarias.

Problema resolvido. Este, e alguns futuros, com certeza. Obrigado.

Rodrigo Salvador

Editado por RSalvador
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...