2012-02-23 3 views
0

Учитывая от задачи, у меня есть эти отношения:Создание запросов SQL и алгебраические выражения из текста

  • отдел (DepCode: рк, DepName, DepAdress)
  • LoanAccs (LoanAcc: рк, имя, DepCode: Ф.К., Телефон: ск)
  • книга (ISBN: рк, Копия: П.К. Автор, Titel, PublishedYear, BoughtYear)
  • LoanedBooks (ISBN: Ф.К., Copy: Ф.К., LoanDate: рк, LoanAcc: Ф.К., Returndate)

Из этого ISBN в книге отношений определяется автор, название и год выпуска. Для каждой комбинации ISBN, loanAcc и loanDate в LoanedBooks существует только макс один экземпляр.

Тогда я должен написать запрос SQL и алгебраическое выражение от задачи, которая говорит:

Составьте список, который показывает все взаймы книги, которые старше, чем через четыре недели, которые еще не были возвращены. Список должен содержать имя и адрес заемщиков. А также автор и название книги. Список должен быть отсортирован на depAdress, и если те, у кого есть тот же адрес, на имени заемщиков в каждом отделе.

Я придумал запрос, который выглядит следующим образом =>

SELECT 
    LoanAccs.name, Department.depAdress, book.author, book.title 
LEFT OUTER JOIN 
    LoanedBooks ON loanAccs.loanAcc = loanedBooks.loanAcc 
LEFT OUTER JOIN 
    Department ON loanAccs.depCode = department.DepCode 
LEFT OUTER JOIN 
    Book ON loanedBooks.ISBN = books.ISBN 
HAVING 
    (CURRENT_DATE - loanedbooks.returndate) <= 28 
ORDER BY 
    depAdress, depCode, name desc; 

Я не совсем уверен, что я установил право запроса вверх, поэтому любые комментарии/пояснения будут оценены:)

Также мне интересно, как записать это как алгебраическое выражение. Как начать, что искать при написании.

ответ

1

Дайте это попробовать

SELECT LoanAccs.name 
, Department.depAdress 
, book.author 
, book.title 
LEFT OUTER JOIN LoanedBooks 
    ON loanAccs.loanAcc = loanedBooks.loanAcc 
LEFT OUTER JOIN Department 
    ON loanAccs.depCode = department.DepCode 
LEFT OUTER JOIN Book 
    ON loanedBooks.ISBN = books.ISBN 
WHERE DATEDIFF(dd, CURRENT_DATE, loanedbooks.returndate) <= 28 
ORDER BY depAdress, depCode, name desc 
+0

Кроме того, в зависимости от системы, вы можете 'get_date()' или 'TODAY()' вместо 'CURRENT_DATE'. И в вашем порядке, только «Имя» появится в порядке убывания. Если вы хотите, чтобы все результаты были в порядке убывания, вам нужно будет поместить 'desc' после каждого из них. – Vinnie

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