2016-04-09 6 views
0

Использование postgresql, мне нужно создать представление под названием «no_cat_customers», которое возвращает имя, фамилию любого клиента, который не был отправлен ни одной книгой «Кошка в шляпе» ». Это должно быть сделано с использованием универсальной количественной оценки. Ошибка, которую я получаю, - «ОШИБКА: ИСКЛЮЧЕНИЕ типов целое и текст не может быть сопоставлен» в отношении строки 7 (EXCEPT (SELECT shipments.isbn).SQL - вложенные подзапросы

CREATE VIEW no_cat_customers(customer_first_name, customer_last_name) 
AS SELECT first_name, last_name 
FROM customers 
WHERE EXISTS (SELECT c_id 
       FROM shipments 
       WHERE customers.c_id = shipments.c_id 
       EXCEPT (SELECT shipments.isbn 
         FROM books, editions, shipments 
         WHERE books.book_id = editions.book_id AND 
         editions.isbn = shipments.isbn AND 
         title LIKE '%The Cat in the Hat%')); 

Я понимаю, что это трудно спросить учитывая, что вы не имеете базу данных я использую, но любая помощь с этим было бы очень признателен!

EDIT: Я должен добавить, что в базе данных есть два выпуска «The Cat in the Hat», оба с разными isbn's. Поэтому это необходимо учитывать.

+0

Обязательно * любые другие * отправления-> товары были доставлены этим клиентам? – wildplasser

+0

@ wildplasser нет, они просто должны быть в списке клиентов и не получать кошку в шляпе – Brittany

+0

В этом случае вы можете делать только с помощью 'select * от клиентов c, где не существует (выберите * из отправлений s join books ON. .JOIN выпуски e ON ... WHERE c.cid = s.cid и b.title LIKE '% cat%'); '- >> вы хотите, чтобы ВСЕ клиенты, которые НЕ заказали эту книгу" – wildplasser

ответ

2

Используйте явный синтаксис JOIN вместо того, чтобы смешивать его с реальными условиями в where where. Я считаю, что это должно работать:

CREATE VIEW no_cat_customers(customer_first_name, customer_last_name) AS 
SELECT first_name, last_name 
FROM customers c 
WHERE NOT EXISTS (
    SELECT 1 
    FROM shipments s 
    JOIN editions e ON s.isbn = e.isbn 
    JOIN books b ON b.book_id = e.book_id 
    WHERE b.title ILIKE '%The Cat in the Hat%' 
    AND c.c_id = s.c_id 
) 

Если у вас есть ошибки типов данных, отлитый столбцы в соответствующие типы, прежде чем сравнивать их.

+0

Мне пришлось приспособиться к b.title = '% The Cat in the Hat%'. Но, к сожалению, это просто вернуло целое обычай er list – Brittany

+0

Добавить ILIKE вместо = –

Смежные вопросы