Представления
Я заново заполнил таблицы данными и создал несколько представлений.
Первое представление копировало таблицу заказов, но заменяло идентификаторы покупателя и продавца на имена покупателя и продавца:
CREATE view view_1 as SELECT onum, odate, amt, cname, sname FROM orders join customers on orders.cnum = customers.cnum join salespeople on orders.snum = salespeople.snum GROUP BY onum;
Так выглядит таблица этого представления в DreamCoder:
|
|
|
|
|
onum |
odate |
amt |
cname |
sname |
1 |
02.11.2006 |
610 |
Василий Дубов |
Федор Захапов |
2 |
02.11.2006 |
8255,5 |
Алексей Шмыга |
Максим Хитров |
3 |
15.06.2007 |
5160 |
Лариса Тупакова |
Максим Хитров |
4 |
05.05.2008 |
310 |
Петр Быков |
Алиса Тырь |
5 |
15.11.2009 |
1200 |
Антон Тотуттотам |
Алиса Тырь |
6 |
17.11.2009 |
15 |
Антон Тотуттотам |
Алиса Тырь |
Второе представление выдаёт список «правильных заказов», то есть заказов таких, что в них номер продавца заказа равен номеру постоянного продавца покупателя заказа:
CREATE view view_2 as
SELECT onum, odate, amt, cname, sname FROM orders
JOIN salespeople on orders.snum = salespeople.snum
JOIN customers on orders.cnum = customers.cnum
WHERE salespeople.snum = customers.snum and orders.snum = customers.snum;
В DreamCoder его таблица совпала с таблицей первого представления. Следовательно, все заказы изначально составлены верно.
Третье представление выдаёт список неверных заказов, то есть ту часть множества заказов, которая не попала в список заказов второго представления. Отличается это представление от второго только тем, что в проверочном условии знаки равенства заменены на знаки неравенства.
CREATE view view_3 as
SELECT onum, odate, amt, cname, sname FROM orders
JOIN salespeople on orders.snum = salespeople.snum
JOIN customers on orders.cnum = customers.cnum
WHERE salespeople.snum != customers.snum and orders.snum != customers.snum;
В базе данных в исходном состоянии представление не содержит строк.
Далее я применил запрос, который изменил номер покупателя в некоторых записях таблицы заказов.
UPDATE orders set snum = 2 where snum = 3;
Далее приведены таблицы представлений после запроса.
view_1:
|
|
|
|
|
onum |
odate |
amt |
cname |
sname |
1 |
02.11.2006 |
610 |
Василий Дубов |
Федор Захапов |
2 |
02.11.2006 |
8255,5 |
Алексей Шмыга |
Федор Захапов |
3 |
15.06.2007 |
5160 |
Лариса Тупакова |
Федор Захапов |
4 |
05.05.2008 |
310 |
Петр Быков |
Алиса Тырь |
5 |
15.11.2009 |
1200 |
Антон Тотуттотам |
Алиса Тырь |
6 |
17.11.2009 |
15 |
Антон Тотуттотам |
Алиса Тырь |
view_2:
|
|
|
|
|
onum |
odate |
amt |
cname |
sname |
1 |
02.11.2006 |
610 |
Василий Дубов |
Федор Захапов |
4 |
05.05.2008 |
310 |
Петр Быков |
Алиса Тырь |
5 |
15.11.2009 |
1200 |
Антон Тотуттотам |
Алиса Тырь |
6 |
17.11.2009 |
15 |
Антон Тотуттотам |
Алиса Тырь |
view_3:
|
|
|
|
|
onum |
odate |
amt |
cname |
sname |
2 |
02.11.2006 |
8255,5 |
Алексей Шмыга |
Федор Захапов |
3 |
15.06.2007 |
5160 |
Лариса Тупакова |
Федор Захапов |
По одним только представлениям уже можно сделать вывод о том, что в базе данных две из шести записей заказов составлены с рассогласованием значения продавца заказа и постоянного продавца покупателя.
Я ввёл и другой запрос, который поменял номер постоянного продавца у двух покупателей:
UPDATE customers set snum = 3 where snum = 4;
Таблица первого представления осталась в том же виде, что и после прошлого запроса. В таблице второго представления осталась всего одна запись:
|
|
|
|
|
onum |
odate |
amt |
cname |
sname |
1 |
02.11.2006 |
610 |
Василий Дубов |
Федор Захапов |
В таблице третьего представления теперь содержались пять записей:
|
|
|
|
|
onum |
odate |
amt |
cname |
sname |
2 |
02.11.2006 |
8255,5 |
Алексей Шмыга |
Федор Захапов |
3 |
15.06.2007 |
5160 |
Лариса Тупакова |
Федор Захапов |
4 |
05.05.2008 |
310 |
Петр Быков |
Алиса Тырь |
5 |
15.11.2009 |
1200 |
Антон Тотуттотам |
Алиса Тырь |
6 |
17.11.2009 |
15 |
Антон Тотуттотам |
Алиса Тырь |
Значит, рассогласование данных теперь наблюдаются почти во всех записях из таблицы заказов.