Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
122
Добавлен:
22.03.2015
Размер:
2.28 Mб
Скачать

Глава 16

1. INSERT INTO Multicust

SELECT *

FROM Salespeople

WHERE 1 <

(SELECT COUNT (*)

FROM Customers

WHERE Customers.snum = Salespeople.snum);

2. DELETE FROM Customers

WHERE NOT EXISTS

(SELECT *

FROM Orders

WHERE cnum = Customers.cnum);

3. UPDATE Salespeople

SET comm = comm + (comm * .2)

WHERE 3000 <

(SELECT SUM (amt)

FROM Orders

WHERE snum = Salespeople.snum);

В более сложный вариант этой команды можно было бы вставить проверку

чтобы убедиться, что значения комиссионных не превышают 1.0 ( 100 % ):

UPDATE Salespeople

SET comm = comm + (comm * .2)

WHERE 3000 <

(SELECT SUM (amt)

FROM Orders

WHERE snum = Salespeople.snum)

AND comm + (comm * .2) < 1.0;

Эти проблемы могут иметь другие, такие же хорошие решения.

Глава 17

1. CREATE TABLE Customers

(cnum integer,

cname char(10),

city char(10),

rating integer,

snum integer);

2. CREATE INDEX Datesearch ON Orders(odate);

( Все индексные имена используемые в этих ответах - произвольные. )

3. CREATE UNIQUE INDEX Onumkey ON Orders(onum);

4. CREATE INDEX Mydate ON Orders(snum, odate);

5. CREATE UNIQUE INDEX Combination ON

Customers(snum, rating);

Глава 18

1. CREATE TABLE Orders

(onum integer NOT NULL PRIMARY KEY,

amt decimal,

odate date NOT NULL,

cnum integer NOT NULL,

snum integer NOT NULL,

UNIOUE (snum, cnum));

или

CREATE TABLE Orders

(onum integer NOT NULL UNIQUE,

amt decimal,

odate date NOT NULL,

cnum integer NOT NULL,

snum integer NOT NULL,

UNIQUE (snum, cnum));

Первое решение предпочтительнее.

2. CREATE TABLE Salespeople

(snum integer NOT NULL PRIMARY KEY,

sname char(15) CHECK (sname BETWEEN 'AA' AND 'MZ'),

city char(15),

comm decimal NOT NULL DEFAULT = .10);

3. CREATE TABLE Orders

(onum integer NOT NULL,

amt decimal,

odate date,

cnum integer NOT NULL,

snum integer NOT NULL,

CHECK ((cnum > snum) AND (onum > cnum)));

Глава 19

1. CREATE TABLE Cityorders

(onum integer NOT NULL PRIMARY KEY,

amt decimal,

cnum integer,

snum integer,

city char (15),

FOREIGN KEY (onum, amt, snum)

REFERENCES Orders (onum, amt, snum),

FOREIGN KEY (cnum, city)

REFERENCES Customers (cnum, city) );

2. CREATE TABLE Orders

(onum integer NOT NULL,

amt decimal,

odate date,

cnum integer NOT NULL,

snum integer,

prev integer,

UNIQUE (cnum, onum),

FOREIGN KEY (cnum, prev) REFERENCES Orders (cnum,onum) );9

Глава 20

1. CREATE VIEW Highratings

AS SELECT *

FROM Customers

WHERE rating =

(SELECT MAX (rating)

FROM Customers);

2. CREATE VIEW Citynumber

AS SELECT city, COUNT (DISTINCT snum)

FROM Salespeople

GROUP BY city;

3. CREATE VIEW Nameorders

AS SELECT sname, AVG (amt), SUM (amt)

FROM Salespeople, Orders

WHERE Salespeople.snum = Orders.snum

GROUP BY sname;

4. CREATE VIEW Multcustomers

AS SELECT *

FROM Salespeople a

WHERE 1 <

(SELECT COUNT (*)

FROM Customers b

WHERE a.snum = b.snum);

Соседние файлы в папке Базы данных