【问题标题】:Joining tables in query with no common fields在查询中加入没有公共字段的表
【发布时间】:2015-04-02 16:08:39
【问题描述】:

我正在为包含以下四个表的库创建一个数据库。

表 1 -

isbn                title            author
111-2-33-444444-5   Pro JavaFX       Dave Smith
222-3-44-555555-6   Oracle Systems   Kate Roberts
333-4-55-666666-7   Expert jQuery    Mike Smith

表 2 - 复制

code    isbn                   duration
1011    111-2-33-444444-5      21
1012    111-2-33-444444-5      14
1013    111-2-33-444444-5      7
2011    222-3-44-555555-6      21
3011    333-4-55-666666-7      7
3012    333-4-55-666666-7      14

表 3 - 学生

no      name      school       embargo
2001    Mike      CMP          No
2002    Andy      CMP          Yes
2003    Sarah     ENG          No
2004    Karen     ENG          Yes
2005    Lucy      BUE          No

表 4 - 贷款

code    no      taken       due         return
1011    2002    2015.01.10  2015.01.31  2015.01.31
1011    2002    2015.02.05  2015.02.26  2015.02.23
1011    2003    2015.05.10  2015.05.31  
1013    2003    2014.03.02  2014.03.16  2014.03.10
1013    2002    2014.08.02  2014.08.16  2014.08.16
2011    2004    2013.02.01  2013.02.22  2013.02.20
3011    2002    2015.07.03  2015.07.10  
3011    2005    2014.10.10  2014.10.17  2014.10.20

我一直在尝试创建一个 SELECT 查询,该查询从“book”中获取 isbn 和标题,从“student”中获取 no 和 name,但只显示持续时间为 7 天的书籍的结果。

我尝试使用 INNER JOIN 加入表,并在“复制”表中使用 LIKE 子句作为“代码”来过滤持续时间,但似乎没有什么对我有用。我无法加入“书”和“学生”,因为它们没有共同的栏目。有没有办法解决这个问题?

编辑

好的,除了最后的 WHERE LIKE 之外,以下查询似乎在大多数情况下都能正常工作;

SELECT book.isbn, book.title, copy.code, copy.duration, student.no, student.name FROM book INNER JOIN copy ON copy.isbn = book.isbn INNER JOIN loan ON loan.code = copy.code INNER JOIN student ON student.no = loan.no WHERE copy.code LIKE 1013 AND copy.code LIKE 3011

我也试过

WHERE copy.code LIKE 1013 AND 3011

仅显示 1013 的结果。我可能遗漏了一些简单的东西,有什么建议吗?

【问题讨论】:

  • 你不能加入没有任何关系的数据。
  • bookstudent 之间的关系似乎是 Book->Copy->Loan->Student。您必须将所有 4 个表连接在一起。试一试:)
  • 看起来模式重构是有序的......
  • 这是我考虑过的另一种方法,但对于看似非常简单的查询来说,它似乎有点长且不必要

标签: sql select join inner-join sql-like


【解决方案1】:

学生

之间似乎没有直接关系
  • bookcopy (isbn) 之间存在关系
  • copyloan(代码)有关系
  • loanstudent之间存在关系(否)

因此我们确实学生

之间存在间接关系

试穿一下尺寸:

SELECT book.isbn
     , book.title
     , book.author
     , copy.code
     , copy.duration
     , loan.taken
     , loan.due
     , loan.return
     , student.no
     , student.name
     , student.school
     , student.embargo
FROM   book
 INNER
  JOIN copy
    ON copy.isbn = book.isbn
 INNER
  JOIN loan
    ON loan.code = copy.code
 INNER
  JOIN student
    ON student.no = loan.no

附:你控制这个数据结构吗?如果是这样,可以推荐一些更改。

【讨论】:

  • 您会推荐哪些更改?
  • 啊,谢谢,这对加入表格非常有用。不幸的是我无法控制数据,数据已经提供了
  • @KubaWyrostek Planty 需要 IMO 进行更改。仅举几例……表格很少包含单行,即“书”应该是“书”。字段名称应清楚地描述数据,例如名为“否”的列是没有意义的。同样的“持续时间” - 这是什么意思?持续时间通常有一个计量单位,例如天、小时、分钟等。出于类似原因,需要重命名列“taken”、“due”和“return”。此外,“return”是关键字,因此应避免使用。
  • 好的,所以实际上只有表名和列名。谢谢。
  • @KubaWyrostek 如果不了解业务需求,我真的无法详细评论实际设计。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多