【问题标题】:Access multi table query returns blanks for one tableAccess多表查询返回一个表的空白
【发布时间】:2021-05-01 20:58:36
【问题描述】:

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

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

在查询设计中,如果我单击加入 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));

【问题讨论】:

  • RentalInventory作为第一个表并左加入下一个(选项2)
  • @Charlieface 那会这样写吗?:INNER JOIN (Rental Inventory LEFT JOIN CostumeInventory ON RentalInventory.InventoryID = CostumeInventory.InventoryRecordID
  • 不应该去FROM RentalInventory LEFT JOIN CostumeInventory INNER JOIN RentalDetails ON ... INNER JOIN RentalClients ON ... ON...,即其他表应该在LEFT JOIN CostumeInventoryONcondition之间
  • 谢谢,成功了!我还修复了一个数据类型不匹配的问题(为什么之前尝试左连接对我不起作用)。现在效果很好,干杯!

标签: sql ms-access join


【解决方案1】:

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

一个 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 视图中替换它,它应该反映在设计视图中。

【讨论】:

  • 谢谢!这是情况#2。我确实有一个数据类型不匹配,我之前错过了我的 FK,一旦纠正它就可以工作了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-19
  • 2017-10-31
  • 1970-01-01
相关资源
最近更新 更多