【问题标题】:SQL Server query that allows me to show an overview of books within bookcasesSQL Server 查询允许我显示书柜中的书籍概览
【发布时间】:2018-10-20 16:34:40
【问题描述】:

我正在尝试让我的程序显示数据库中所有书架的概览,以及相关的书架/隔间以及这些书架或隔间中的书籍。

我正在使用 Microsoft Visual Studio 2017 Windows 窗体应用程序。

我的SQL Server数据库结构如下:

  • user 表(用户 ID、用户名、密码)
  • bookcase table (bookcaseId, name, location, userId)
  • Shelf table (shelfId, bookcaseId)
  • compartment table (compartmentId, bookcaseId)
  • book table(bookid、title、author、serie、genre、compartmentId、shelfId)

我知道如何通过使用每个表中的Select * 来使用查询来获取所有书籍、书架、用户等的概览。

我也知道订购时我只需使用Order by bookcaseId

我将如何实现这一目标?

【问题讨论】:

  • “概览”是什么意思?样本数据和期望的结果会有所帮助。

标签: sql sql-server


【解决方案1】:

另一种可能的方法是将bookshelves 用于您的FROM 子句。这种方法的原因(如果我正确理解您的数据库设计)是事实,bookcaseId 似乎是shelfcompartment 表中的外键。

SELECT 
    bk.bookcaseId, bk.name, bk.location,
    b.bookid, b.title, b.author, b.serie, b.genre, b.compartmentId, b.shelfId
FROM bookcase bk
LEFT JOIN shelf s ON (bk.bookcaseId = s.bookcaseId)
LEFT JOIN compartment c ON (bk.bookcaseId = c.bookcaseId)
LEFT JOIN book b ON (c.compartmentId = b.compartmentId) AND (s.shelfId = b.shelfId)
ORDER BY bk.bookcaseId, s.shelfId, c.compartmentId

【讨论】:

  • 是的,这正是我想要的。谢谢。
【解决方案2】:

您可以使用正确的键加入它们。
然后从他们那里获取您需要的字段。

那个 bookcaseId 是两个表中的外键。

因此,可能在 books 表中填充了隔间 ID 或/和架子 ID。

但您可以同时加入两者,然后同时获得两者的用户。

SELECT 
book.title AS book_title, 
book.author AS book_author, 
book.serie AS book_serie,
book.genre AS book_genre,
bcs.name AS shelf_bookcase_name, 
bcs.location AS shelf_bookcase_location,
us.username AS shelf_bc_username,
bcc.name AS compartment_bookcase_name, 
bcc.location AS compartment_bookcase_location,
uc.username AS compartment_bc_username
FROM book
LEFT JOIN compartment AS cmp ON cmp.compartmentId = book.compartmentId
LEFT JOIN bookcase AS bcc ON bcc.bookcaseId = cmp.bookcaseId
LEFT JOIN [user] AS uc ON uc.userId = bcc.userId
LEFT JOIN shelf ON shelf.shelfId = book.shelfId
LEFT JOIN bookcase AS bcs ON bcs.bookcaseId = shelf.bookcaseId
LEFT JOIN [user] AS us ON us.userId = bcs.userId
ORDER BY coalesce(shelf.bookcaseId, cmp.bookcaseId)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 2021-09-22
    相关资源
    最近更新 更多