sql - Access多表查询返回一个表的空白
问题描述
我没有编程或数据库背景(最终用户除外),我正在使用 365 中的 Access 构建数据库。我对 SQL 的掌握非常有限。
我已经编写了一个多表查询来作为报告的基础,而且它大部分都有效。它将返回除一张表之外的所有请求的数据(CostumeInventory)
。对于该表,它会创建 columns (ItemName, Description, Condition, RentalRate, ReplacementValue)
,但这些列中的行是空白的。. 在 CostumeInventory 表中,它们是必需的,设置为短文本,并且都包含数据。
在查询设计中,如果 IR 单击加入 CostumeInventory,我选择了选项 3。1 什么都不返回,2 告诉我在尝试运行它时修复“模糊外部连接”错误。我尝试以两种不同的方式创建子查询(一种加入 RentalInvenory 和 CostumeInventory,另一种将所有 Rental-- 表加入 CostumeInventory),但都没有产生任何结果。我可以尝试任何建议吗?先感谢您!下面是 Access 写的代码:
SELECT RentalClients.CompanyName, RentalDetails.ShowTitle, RentalDetails.Designer,
RentalDetails.OpeningDate, RentalDetails.ClosingDate, RentalDetails.FirstFitArrivalDate,
RentalDetails.ApprovalDate, RentalDetails.ReturnDate, RentalClients.CostumeContact,
RentalClients.CostumeEmail,
RentalInventory.InventoryID, CostumeInventory.ItemName, CostumeInventory.Description,
CostumeInventory.Condition, CostumeInventory.RentalRate, CostumeInventory.ReplacementValue
FROM (RentalClients
INNER JOIN RentalDetails ON RentalClients.ClientID = RentalDetails.ClientID)
INNER JOIN (CostumeInventory
RIGHT JOIN RentalInventory
ON CostumeInventory.InventoryRecordID = RentalInventory.InventoryID)
ON RentalDetails.RentalID = RentalInventory.RentalID
WHERE (((RentalDetails.RentalID)=[forms]![frmUpdateRental]![cboSelectRental]) AND
((RentalInventory.ReturnedApproval)=False) AND
((RentalInventory.ReturnedOpening)=False) AND
((RentalInventory.ReturnedFinal)=False));
解决方案
根据您的介绍,我认为您拥有的是:
一个 RentalClient 可以有许多 RentalDetails。加入:ClientID
一个 RentalDetail 使用多个 RentalInventory。加入:租借ID
这是似乎存在差异的部分:
RentalInventory 表似乎是一个关联表,用于解决具有 PrimaryKey(SetID, InventoryID) 的 Inventory 表和具有 PrimaryKey(RentalID) 的 RentalDetails 表之间的多对多关系
由于我在您的查询中没有看到 Inventory 表,因此有两种可能性:
- 您缺少带有 PrimaryKey(SetID, InventoryID) 的 Inventory 表,而表 CostumeInventory 是该表的从属子表,因此我们得到:
SELECT *
FROM RentalClients
INNER JOIN RentalDetails ON RentalClients.ClientID = RentalDetails.ClientID
INNER JOIN RentalInventory ON RentalDetails.RentalID= RentalInventory.RentalID
INNER JOIN Inventory ON RentalInventory.SetID=Inventory.SetID
and RentalInventory.InventoryID=Inventory.InventoryID
LEFT JOIN CostumeInventory on Inventory.SetID=CostumeInventory.SetID
and Inventory.InventoryID=Inventory.InventoryID
- 第二种可能性是 CostumeInventory 表是具有自动生成的 InventoryRecordID 以及对 InventoryID 和 SetID 的唯一约束的 Inventory 表。如果是这样,则您的连接不正确,这表明在建模过程中出错 - RentalInventory 表应该只有字段 RentalID 和 InventoryRecordID(表示 SetID 和 InventoryID)。要解决您的查询的这个问题(不接触模型),您的查询应该是:
SELECT *
FROM RentalClients
INNER JOIN RentalDetails ON RentalClients.ClientID = RentalDetails.ClientID
INNER JOIN RentalInventory ON RentalDetails.RentalID= RentalInventory.RentalID
LEFT JOIN CostumeInventory ON RentalInventory.SetID=CostumeInventory.SetID and RentalInventory.InventoryID=Inventory.InventoryID
InventoryRecordID 在大多数系统中通常是一些自动生成的数字,因此任何加入它都可能是不正确的。它应该在 SetID 和 InventoryID 上,因为这更适合关联表 RentalInventory 的等式的另一边,第一个已经由 RentalID 处理。同样,这假设选项 #2 反映了真实情况。
如果 CostumeInventory 表中的 SetID 和 InventoryID 字段没有唯一约束,那么上面的 #1 很可能是这种情况。
总体而言,MS Access 通过设计视图的行为往往会在查询中添加许多括号/括号,从而使 SQL 变得复杂并且在您转到 SQL 视图时更难阅读。如果可以,您应该简化理解 - 以自己的方式编写(如果需要,使用别名)并在 SQL 视图中替换它,它应该反映在设计视图中。
推荐阅读
- jsp - 打印 jstl c:forEach 循环数据存在与否的行的特定长度
- documentation - Doxygen 将所有内容视为 C++ 项目中的详细描述
- apache-spark - pyspark 显式广播的最大大小
- c - 将语句分隔符更改为 ; 以外的其他内容 用#define
- vb.net - 有没有办法从 Visual Basic 中的特定命名空间获取所有函数(或子)名称?
- nginx - 在nginx中获取自纪元(秒)以来的当前时间字符串
- python - 导入错误:无法导入名称 input_reader_pb2
- regex - 正则表达式用于一系列字符序列但不连续?
- python - Pyplot没有绘制数据数组的某些元素
- php - Laravel 5.4:无法在视图中显示 crud 内容