Dúvida em instrução SQL

Galera,

Na faculdade o professor pediu para fazer um banco simples para estudar alguns conceitos de SQL. E em um exercicio ele disse que continha um erro “classico” que eu não consegui identificar. Ele pediu para que eu pesquisasse sobre o erro e não conssegui achar. POdem me ajudar?

Select com o erro “classico” e invisivel aos meus olhos! Rsrsrs.

--Apresentar o nome dos autores que não são autores do livro Banco de Dados. SELECT NOME, TITULO FROM TB_LIVRO L JOIN TB_LIVRO_AUTOR TA ON (TA.COD_LIVRO = L.CODIGO) JOIN TB_AUTOR A ON (TA.COD_LIVRO = A.CODIGO) WHERE L.TITULO NOT LIKE 'BANCO DE DADOS';

[code]–CRIAÇÃO DO BANCO
Create database DB_AULAS

–CRIAÇÃO DA TABELA EDITORA
CREATE TABLE TB_EDITORA
(
CODIGO INT NOT NULL IDENTITY,
DESCRICAO VARCHAR(50) NOT NULL,
ENDERECO VARCHAR(50)
);

–CRIAÇÃO DA TABELA LIVRO
CREATE TABLE TB_LIVRO
(
CODIGO INT NOT NULL IDENTITY,
ISBN VARCHAR(10) NOT NULL,
TITULO VARCHAR(50) NOT NULL,
EDICAO SMALLINT NOT NULL,
PRECO NUMERIC(9,2) NOT NULL,
COD_EDITORA INT NOT NULL
);

–CRIAÇÃO DA TABELA AUTOR
CREATE TABLE TB_AUTOR
(
CODIGO INT NOT NULL IDENTITY,
NOME VARCHAR(50) NOT NULL,
SEXO CHAR(1) NOT NULL,
DATA_NASCIMENTO DATETIME NOT NULL
);

– CRIAÇÃO DA TABELA LIVRO_AUTOR
CREATE TABLE TB_LIVRO_AUTOR
(
CODIGO INT NOT NULL IDENTITY,
COD_LIVRO INT NOT NULL,
COD_AUTOR INT NOT NULL

);[/code]

pvrsouza,

Existem erros de SQL? Ou o erro está nos resultados?

Se for problemas com o resultado da consulta, creio que o erro esteja nessa linha:

 TB_AUTOR A ON (TA.COD_LIVRO = A.CODIGO)  

você está comparando o código do livro com o código do autor.

[]'s

[quote=Edenilton Fr?s]pvrsouza,

Existem erros de SQL? Ou o erro está nos resultados?

Se for problemas com o resultado da consulta, creio que o erro esteja nessa linha:

 TB_AUTOR A ON (TA.COD_LIVRO = A.CODIGO)  

você está comparando o código do livro com o código do autor.

[]'s[/quote]

Realmente esse foi o único erro que encontrei também.

Apenas vais apresentar nomes de autores com livros. A primeira tabela deveria ser de autores e não de livros

Galera,

Agradeço a atenção de todos mas o mistério foi desvendado. Rsrsrs. O problema era na lógica. Do jeito que eu estava fazendo, supondo que o Autor tivesse escrito mais de um livro que não fosse o “Banco de Dados”. Desta forma, ele iria exibir o autor por conta dos outros livros que ele escreveu.

SELECT NOME, TITULO FROM TB_LIVRO L JOIN TB_LIVRO_AUTOR TA ON (TA.CODIGO_LIVRO = L.CODIGO) JOIN TB_AUTOR A ON (TA.CODIGO_AUTOR = A.CODIGO) WHERE L.TITULO NOT LIKE 'BANCO DE DADOS';

O certo seria assim:

[code]SELECT
NOME, CODIGO
FROM
TB_AUTOR A
WHERE
NOT EXISTS (
SELECT
LA.CODIGO_AUTOR
FROM
TB_LIVRO_AUTOR LA
JOIN
TB_LIVRO L ON (LA.CODIGO_LIVRO = L.CODIGO)
WHERE
L.TITULO LIKE ‘Banco de Dados’ AND
LA.CODIGO_AUTOR = A.CODIGO

);[/code]

Ou assim:

SELECT NOME, CODIGO FROM TB_AUTOR A WHERE CODIGO NOT IN ( SELECT LA.CODIGO_AUTOR FROM TB_LIVRO_AUTOR LA JOIN TB_LIVRO L ON (LA.CODIGO_LIVRO = L.CODIGO) WHERE L.TITULO LIKE 'BANCO de dados' );

Espero ter sido claro!

Abraços

Era isso que eu queria dizer. :slight_smile:

Eu tb! Rsrsrs.

Abraços