Ausgabe
Ich habe eine Bibliotheksdatenbank, die ich verwende. Die Datenbank enthält 5 Tabellen, wie unten gezeigt. Ich verwende MS SQL Server Management Studio
Ich zeige derzeit die bookId, den Buchnamen, den Autor des Buches, die Anzahl der Buchseiten und Punkte aus der Buchtabelle mit dem folgenden Code an.
select
books.bookId,
books.name,
authors.surname,
types.name,
books.pagecount,
books.point
from books
join authors
on books.authorId = authors.authorId
join types
on books.typeId = types.typeId
Ich muss jedoch auch eine Statusspalte von entweder available
oder out
basierend auf der folgenden Logik anzeigen
IF borrows.takenDate < current_timeStamp
AND borrows.broughtDate = null
THEN display status = Out (in status alias column)
ELSE display status Available (in status alias column)
Diese Logik muss der zuvor im Beitrag erwähnten SQL-Anweisung hinzugefügt werden.
Wie würde ich das in SQL machen?
Vielen Dank für die Hilfe 🙂
Lösung
Da es so aussieht, als wäre Borrows eine assoziative (Verbindungs-)Tabelle zwischen Büchern und Schülern und könnte mehrere Aufzeichnungen von genommen/zurückgegeben haben, sollten Sie das MAX
Datum der Aufnahme für jede eindeutige bookId in einer Unterabfrage abrufen und diese mit Ihrer äußeren Abfrage verbinden , können Sie dann eine CASE
Anweisung verwenden, um zu prüfen, ob die Unterabfrage bookId null ist, wenn ja, bedeutet dies, dass das Buch verfügbar ist, andernfalls ist es ausgecheckt:
select
books.bookId,
books.name,
authors.surname,
types.name,
books.pagecount,
books.point
--Use case expression to see if subquery bookId is null on join
--if so, it's available else it's checked out
case when t.bookId is null then 'Available' else 'Out' end as [status]
from books
join authors
on books.authorId = authors.authorId
join types
on books.typeId = types.typeId
left join --subquery returns bookId's for all books currently checked out
(
select bookId
from borrows
where takenDate < current_timestamp and broughtDate is null
group by bookId, takenDate
having takenDate = max(takenDate)
) as t
on t.bookId = books.bookId
Beantwortet von – Ryan Wilson
Antwort geprüft von – David Goodson (FixError Volunteer)