首页 > 解决方案 > Access多表查询返回一个表的空白

问题描述

我没有编程或数据库背景(最终用户除外),我正在使用 365 中的 Access 构建数据库。我对 SQL 的掌握非常有限。

我已经编写了一个多表查询来作为报告的基础,而且它大部分都有效。它将返回除一张表之外的所有请求的数据(CostumeInventory)。对于该表,它会创建 columns (ItemName, Description, Condition, RentalRate, ReplacementValue),但这些列中的行是空白的。截屏. 在 CostumeInventory 表中,它们是必需的,设置为短文本,并且都包含数据。

在查询设计中,如果 IR 单击加入 CostumeInventory,我选择了选项 3。截图21 什么都不返回,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));

标签: sqlms-accessjoin

解决方案


根据您的介绍,我认为您拥有的是:

一个 RentalClient 可以有许多 RentalDetails。加入:ClientID

一个 RentalDetail 使用多个 RentalInventory。加入:租借ID

这是似乎存在差异的部分:

RentalInventory 表似乎是一个关联表,用于解决具有 PrimaryKey(SetID, InventoryID) 的 Inventory 表和具有 PrimaryKey(RentalID) 的 RentalDetails 表之间的多对多关系

由于我在您的查询中没有看到 Inventory 表,因此有两种可能性:

  1. 您缺少带有 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
  1. 第二种可能性是 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 视图中替换它,它应该反映在设计视图中。


推荐阅读