2017-06-13 269 views
1

所以首先抱歉我的英语,我的母语是德语。MS Access VBA选择查询

我有几个表的Access数据库,数据库充满了愈合的植物,并有一个名为表“问题”,它看起来像这样:

列:ID - 姓名 - 头痛 - - 疼痛 - 呕吐 - 依此类推......

而像头痛等适应症的列是布尔型 - 真或假。

现在我想提出一个询问,要求用户(用一个表格左右的列表框或文本输入框)告诉他的指示,然后应该有一个物质/植物列表,其中指示值(ColumnName)为真。

我认为这是一个参数在表中搜索列。

回答

5

我会看看你的数据库的设计。如果另一个问题变得明显,那么为每个问题设置一个具有单独列的表将是一个真正令人头痛的问题。

我可能会使用四个表此:

  • 用户:用户ID(AUTONUM,PK),用户名(文本)
    enter image description here
  • 植物:PlantID(AUTONUM ,PK),PlantName(Text)
    enter image description here
  • IssueList:IssueID(AUTONUM,PK),IssueDescription(文本)
    enter image description here
  • User_Issues:用户ID(民,PK),PlantID(民,PK),IssueID(民,PK),HasIssue(布尔)
    enter image description here

User_Issues表中有一个组合键,组成了其他表中的每个标识符 - 这将确保用户不能多次对工厂有同样的问题。

当新用户创建一个查询运行更新User_Issues表:

INSERT INTO User_Issue(PlantID, IssueID, UserID) 
SELECT  PlantID, IssueID, UserID 
FROM  Plants, IssueList, Users 
WHERE  UserName = "Darren" 

这将创建一个从植物和问题,为每个用户笛卡尔乘积。因此,例如,如果您有两个工厂和三个问题,您将获得2×3个记录 - 这两个工厂可能存在6个问题。
enter image description here

这个SQL将允许你分配一个问题:

SELECT  UserName 
      , PlantName 
      , IssueDesc 
      , HasIssue 
FROM  ((
      User_Issue INNER JOIN Users ON User_Issue.UserID = Users.UserID) 
         INNER JOIN Plants ON User_Issue.PlantID = Plants.PlantID) 
         INNER JOIN IssueList ON User_Issue.IssueID = IssueList.IssueID 
ORDER BY PlantName, IssueDesc 

enter image description here

要查看你只需要添加WHERE HasIssue上述SQL的问题。

SELECT  UserName 
      , PlantName 
      , IssueDesc 
      , HasIssue 
FROM  ((
      User_Issue INNER JOIN Users ON User_Issue.UserID = Users.UserID) 
         INNER JOIN Plants ON User_Issue.PlantID = Plants.PlantID) 
         INNER JOIN IssueList ON User_Issue.IssueID = IssueList.IssueID 
WHERE  HasIssue 
ORDER BY PlantName, IssueDesc 

enter image description here

+0

哇..什么是完整的答案不完整的问题!接下来的事情会要求给他的工作LOL –

+0

@krishKM这可能是充满了漏洞。我不喜欢有一个附加查询来为'User_Issue'表添加值,但我不能想出一种在SQL中列出每个工厂的所有问题而不使查询不可更新的方法。 –

+0

感谢您的详细解答Darren! 您的想法完全适合我! –