MS Access内部加入或

时间:2013-12-03 21:25:09

标签: sql ms-access ms-access-2010

我在MS Access 2010中遇到了查询构建器的问题。我无法连接两个表,其中一个表有两个对另一个表的引用。我有一个表,Workers,有两列,HumanFactor1和HumanFactor2。这两个都指向表HumanFactors,它只包含两个字段,ID和HumanFactor。此表用于为用户填充两个组合框选择器,然后这些选择将作为FK存储在Worker中。

使用查询构建器,它会自动创建以下SQL

SELECT Incident.*, Worker.*
FROM HumanFactors RIGHT JOIN 
(Incident LEFT JOIN Worker ON Incident.ID = Worker.IncidentID) ON 
(HumanFactors.ID = Worker.HumanFactor2) AND (HumanFactors.ID = Worker.HumanFactor1)
WHERE (((HumanFactors.HumanFactor)="Fatigue"));

这不起作用,因为这两个在实践中总是会有所不同,所以唯一返回的结果是我强制两个HumanFactors都相同的记录。通过简单地更改为OR表达式

,这非常容易通过SQL修复
SELECT Incident.*, Worker.*
FROM HumanFactors RIGHT JOIN 
(Incident LEFT JOIN Worker ON Incident.ID = Worker.IncidentID) ON 
(HumanFactors.ID = Worker.HumanFactor2) OR (HumanFactors.ID = Worker.HumanFactor1)
WHERE (((HumanFactors.HumanFactor)="Fatigue"));

这给了我正是我正在寻找的东西,但我无法弄清楚如何在Builder中创建OR实例。当我尝试回到设计视图时,应用程序就吓坏了。

有没有办法通过构建器处理这个问题而不需要更改SQL?我的用户拒绝做任何比拖放更复杂的事情。或者我是否必须在两者之间创建链接表?我的问题是,虽然链接表使查询构建器工作得很好,但我无法将数据重新连接到控件。只有两个组合框,而不是您期望的那个组合的一个组合。感谢。

3 个答案:

答案 0 :(得分:1)

您可以在使用查询构建器创建的查询中添加表的多个实例。当您第一次添加表时,其别名将只是表名(例如,[HumanFactors]),当您添加第二次时,其名称将是附加了_1的表名。您可以通过单击表格然后打开“属性”窗格来更改别名(请参阅下面的屏幕截图)。

在您的情况下,我相信查询看起来像这样:

QueryBuilder.png

(要查看更大版本的屏幕截图,请右键单击它并选择“查看图像”。)

答案 1 :(得分:0)

SELECT Incident.*, Worker.*
FROM
    HumanFactors HF
    LEFT JOIN Worker W ON HF.ID = W.HumanFactor1 OR HF.ID = W.HumanFactor2
    LEFT JOIN Incident I ON I.ID = W.IncidentID

答案 2 :(得分:0)

怎么回事:

enter image description here

这将为您提供人为因素疲劳的所有记录。不完全是你的方式,但也可能有用。