问题描述
我希望有一个 GUI,当我单击发票时,它还会在一行中显示来自客户和产品的信息,例如名称、品牌等。 我是否也必须将名称、品牌等也放入 Invoice 并在内部加入所有内容?
Invoice Table Customer Table Product Table
解决方法
编辑:
不,无需修改您所指的表格。它们都包含一个从发票表引用的唯一主键列。基于它们,INNER JOIN
可以被公式化。
也许还值得一提:不要将 INNER JOIN
与同样存在的 SELF JOIN
混淆。
不同之处在于 INNER JOIN
仍然根据特定列(例如 id)连接两个不同的表,而 SELF JOIN
正在将单个表与其自身连接。
是的,您需要的是 INNER JOIN
将 发票表 中的信息与 客户表 中的信息以及 >产品表 - 全部基于您给定的发票 ID(列:idInvoice)。
要获得所需的信息,您无需在发票表中添加——因此也无需重复——。由于连接,它们将可用于单个查询中的选择。
您的查询应如下所示:
SELECT *
FROM invoice inv,customer cust,product prod
WHERE
inv.idCustomer = cust.idCostumer
AND
inv.idProduct = prod.idProduct
AND
inv.idInvoice = ${theIdOfTheInvoiceTheUserClickedOn}
注意:如果您不需要三个表中的所有信息(列)(“*”代表什么),您可以将“*”替换为仅明确说明的枚举要显示的列。例如。 inv.id,cust.FirstName,cust.LastName
。
取决于您确切使用的数据库技术/方言。上面的示例适用于 Oracle
数据库,也适用于大多数其他数据库,因为查询中仅使用了基本的 SQL
功能。
我假设您没有使用任何像 Hibernate
这样的 ORM 框架,并且您需要自己编写查询(因为您没有提供有关你的技术栈)。如果您使用的是 ORM 框架,则该方法需要看起来不同,但最终生成的查询应该看起来相似。
在上面的查询中,WHERE clause
中的前两个条件隐式地构成了 INNER JOIN
,最后第三个条件指定了您要查找的确切条目。
尽管您只询问了是否需要 INNER JOIN
,但我在此处向您提供了查询,因为您的问题暗示您不确定如何编写。
您可以将其作为可以与您的解决方案进行比较的工作示例。您应该尝试了解它的工作原理以及如何编写它,并进一步研究 SQL
基础知识,以便您也可以自己编写它。
提示:PreparedStatements 是从 Java
以安全的方式对数据库执行此类查询的方法
在我看来,根据您的应用程序,您可以使用包含您需要和不需要连接表的内容的平面表。此解决方案适用于数据集较小的情况(例如,在银行业务中,Terminal
表与 ATMTerminal
、POSTerminal
和 CashlessTerminal
表之间的关系)。
对于一侧是静态数据(如上例)而另一侧是交易数据(如银行交易)的情况,您应该使用来自事务表到静态数据表。
我建议您对您的问题使用第二种解决方案,并使用外键处理关系并使用连接策略获取您需要的列。