2015-02-18 8 views
-1

У меня есть следующий db с таблицами, и я пытаюсь их запросить: Извлеките имена, адреса и количество книг, выписанных для всех заемщиков, у которых осталось более пяти книг. Я создал запросБаза данных Oracle, где статья

select name, Address 
from BORROWER 
where BOOK_LOANS.BookId >= 5; 

Кажется, я нужен присоединиться к таблицам, я застрял здесь, Могу ли я, пожалуйста, получить помощь?

CREATE TABLE BOOK ( 
    BookId CHAR(20) NOT NULL, 
    Title VARCHAR(30) NOT NULL, 
    PublisherName VARCHAR(20), 
    PRIMARY KEY (BookId), 
    FOREIGN KEY (PublisherName) REFERENCES PUBLISHER (PublisherName) 
); 

CREATE TABLE BOOK_AUTHORS ( 
    BookId CHAR(20) NOT NULL, 
    AuthorName VARCHAR(30) NOT NULL, 
    PRIMARY KEY (BookId, AuthorName), 
    FOREIGN KEY (BookId) REFERENCES BOOK (BookId) 
    ON DELETE CASCADE 
); 

// PublisherName was added, as it was referenced by another 
// table but did not exist as an attribute. 

CREATE TABLE PUBLISHER ( 
    PublisherName VARCHAR(20) NOT NULL, 
    Address VARCHAR(40) NOT NULL, 
    Phone CHAR(12), 
    PRIMARY KEY (PublisherName) 
); 

CREATE TABLE BOOK_COPIES ( 
    BookId CHAR(20) NOT NULL, 
    BranchId INTEGER NOT NULL, 
    No_Of_Copies INTEGER NOT NULL, 
    PRIMARY KEY (BookId, BranchId), 
    FOREIGN KEY (BookId) REFERENCES BOOK (BookId) 
    ON DELETE CASCADE, 
    FOREIGN KEY (BranchId) REFERENCES BRANCH (BranchId) 
    ON DELETE CASCADE 
); 

CREATE TABLE BORROWER ( 
    CardNo INTEGER NOT NULL, 
    Name VARCHAR(30) NOT NULL, 
    Address VARCHAR(40) NOT NULL, 
    Phone CHAR(12), 
    PRIMARY KEY (CardNo) 
); 

CREATE TABLE BOOK_LOANS ( 
    CardNo INTEGER NOT NULL, 
    BookId CHAR(20) NOT NULL, 
    BranchId INTEGER NOT NULL, 
    DateOut DATE NOT NULL, 
    DueDate DATE NOT NULL, 
    PRIMARY KEY (CardNo, BookId, BranchId), 
    FOREIGN KEY (CardNo) REFERENCES BORROWER (CardNo) 
    ON DELETE CASCADE, 
    FOREIGN KEY (BranchId) REFERENCES BRANCH (BranchId) 
    ON DELETE CASCADE, 
    FOREIGN KEY (BookId) REFERENCES BOOK (BookId) 
    ON DELETE SET NULL 
); 

CREATE TABLE BRANCH ( 
    BranchId INTEGER NOT NULL, 
    BranchName VARCHAR(20) NOT NULL, 
    Address VARCHAR(40) NOT NULL, 
    PRIMARY KEY (BranchId) 
); 
+1

Да, вам необходимо присоединиться. К счастью, они довольно хорошо документированы. Что вы пробовали? – GolezTrol

+0

Вы отмечаете MySQL, но говорите Oracle. Что вы имеете в виду? – jarlh

+0

MySQL также является Oracle. ;-) Тем не менее, это ваш третий вопрос, когда требуется серьезная повторная пометка, и не было предпринято никаких усилий, чтобы попытаться решить проблему самостоятельно. Поэтому я отклонил ваш вопрос. Сначала попробуйте самостоятельно решить проблему. Если у вас есть реальная попытка, мы здесь, чтобы помочь. Кроме того, приложите усилия и к своим вопросам. Это * ваша * проблема, которая нуждается в решении. – GolezTrol

ответ

1

Вам действительно нужно объединение, которое соединяет BORROWER таблицу с BOOK_LOANS столом. Соединение должно быть на общем ключе (CardNO).

Чтобы подсчитать количество книг, заимствованных использовать агрегатную функцию COUNT(), и вы объедините это с пунктом GROUP BY расщепа ваших данных, чтобы группы, основанных на уникальной комбинации CardNo, Name, Address.

Теперь у вас есть количество книг, заимствованных для каждого CardNo.

Наконец, вы применяете предложение HAVING, чтобы отфильтровать группы, чтобы включать только те группы, у которых есть счет из пяти или более книг, заимствованных.

SELECT b.Name, b.Address, COUNT(*) AS BookCount 
FROM BORROWER b 
JOIN BOOK_LOANS bl ON b.CardNo = bl.CardNo 
GROUP BY b.CardNO, b.Name, b.Address 
HAVING COUNT(bl.BookID) >= 5 
+0

Спасибо !!! большое объяснение, и я сейчас смотрю HAVING Clause. Я делал подсчет и ORDER BY – sb0709

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