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
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'
);