Dúvida em instrução SQL

6 respostas
pvrsouza

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

);

6 Respostas

E

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

Hebert_Coelho

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

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

pmlm

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

pvrsouza

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:

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

pmlm

Era isso que eu queria dizer. :slight_smile:

pvrsouza

Eu tb! Rsrsrs.

Abraços

Criado 21 de setembro de 2010
Ultima resposta 22 de set. de 2010
Respostas 6
Participantes 4