【问题标题】:Access 2007 query incorrectly returns zero recordsAccess 2007 查询错误地返回零记录
【发布时间】:2011-07-19 12:56:00
【问题描述】:

我在 Access 中有一个小型数据库,除了以下问题外,它运行良好。数据库设计正确,其他 100 个查询都可以正常工作。我试图找到正确的 SQL 来返回正确的记录。肯定有符合 (((tblComorbidity.comorbidityexplanation)="infection" And (tblComorbidity.comorbidityexplanation)="pressure sores")) 的记录;部分,但由于某种原因,它什么也不返回。有什么建议么?谢谢

    SELECT DISTINCT Person.PersonID, tblComorbidity.comorbidityexplanation
    FROM 
tblKentuckyCounties INNER JOIN 
(tblComorbidity INNER JOIN (Person INNER JOIN tblComorbidityPerson ON Person.PersonID = tblComorbidityPerson.personID) ON tblComorbidity.ID = tblComorbidityPerson.comorbidityFK) ON tblKentuckyCounties.ID = Person.County
    WHERE 
(((tblComorbidity.comorbidityexplanation)="infection" And (tblComorbidity.comorbidityexplanation)="pressure sores"));

【问题讨论】:

  • 你能给我们一些样本数据吗?它应该返回一些东西,但没有?
  • 当然,如果 "And (tblComorbidity.comorbidityexplanation)="pressure sores"));"被删除它返回大约 100 条记录。如果您将上述语句中的压疮更改为“感染”,它还会返回大约 100 条记录。尽管有大约 70 条记录同时包含两者,但没有返回。
  • 您需要调整此问题以反映您想要一个同时具备这两种合并症解释的人。
  • 附带说明:我认为您在 WHERE 子句中的括号过分了...
  • 您需要的关系运算符是division,俗称"the supplier who supplies all parts"

标签: sql ms-access


【解决方案1】:

您的 SQL 正在尝试获取所有解释“感染”和“压疮”的 tblComorbidity 记录。这是不可能的,因为一个 tblComorbidity 记录只有一个解释。

(我猜)您真正想要的是获取所有人员,其中存在一个解释 =“感染”的 tblComorbidity 记录,并且存在另一个解释 =“压疮”的 tblComorbidity 记录。这听起来很相似,但它是不同的,它需要以不同的方式完成。

类似以下 SQL 的内容应该可以满足您的要求:

SELECT DISTINCT Person.PersonID
  FROM ((((Person INNER JOIN tblComorbidityPerson AS InfPers ON Person.PersonID = InfPers.PersonID)
          INNER JOIN tblComorbidity AS Inf ON InfPers.comorbidityFK = Inf.ID)
         INNER JOIN  tblComorbidityPerson AS SorePers ON Person.PersonID = SorePers.PersonID)
        INNER JOIN tblComorbidity AS Sore ON SorePers.comorbidityFK = Sore.ID)
       INNER JOIN tblKentuckyCounties ON tblKentuckyCounties.ID = Person.County
 WHERE Inf.comorbidityexplanation = "infection"
   AND Sore.comorbidityexplanation = "pressure sores";

基本上,您需要加入合并症两次(每种解释一次)。

【讨论】:

  • 啊啊啊。这就是他想要的。我今天有点慢……好赶上! +1
  • +1 互联网 :) 这就是我想要的,但我没有做对。
【解决方案2】:
(((tblComorbidity.comorbidityexplanation)="infection" OR (tblComorbidity.comorbidityexplanation)="pressure sores"));

这里需要 OR,而不是 AND。 tblComorbidity.comorbidityexplanation 不能同时是两个不同的值。

【讨论】:

  • 这并不完全符合我的需要。我只需要返回同时具有“感染”和“压疮”的记录。这样做会返回没有“感染”和“压疮”的记录
  • 不可能。您的查询永远不会返回结果。同一列不能有 2 个不同的值。也许您在另一个连接的表中有另一个名为 coorbidityexplanation 的列?
  • 不,我没有这样设置。我想我应该只运行一个查询并将其与另一个查询进行比较。谢谢。
【解决方案3】:

cularis 在正确的轨道上。在 where 子句之后,您需要添加

GROUP BY Person.PersonID
HAVING count(*) = 2

这将按人员对子表中的记录进行分组,并确保计数为 2(一个用于“感染”,一个用于“压疮”)。

【讨论】:

  • +1,“多连接”变体的优雅替代方案。但请注意,这种基于 COUNT 的解决方案仅适用于每个人最多有一个“感染”记录(压疮也是如此)。
  • @Heinzi - 感谢您指出这一点,这是正确的。在我的测试中是这样的,但对于 OP 来说,情况并非如此——该 sql 语句比我测试的更复杂,而且我不确定 OP 的表结构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多