MS Access VBA选择查询

时间:2017-06-13 10:19:09

标签: sql database vba ms-access

首先抱歉我的英语,我的母语是德语。

我有一个带有几个表的ACCESS数据库,数据库中充满了愈合植物,并且有一个名为“问题”的表看起来像:

列:ID - 名称 - 头痛 - 疼痛 - 呕吐 - 等等......

像头痛这样的指示的列是布尔 - 真或假。

现在我想做一个询问用户的问题(使用表单左右的列表框或文本输入)告诉他的指示,然后应该有一个物质/工厂列表,其中的值指示(ColumnName)为真。

我认为这是列表中搜索的参数。

1 个答案:

答案 0 :(得分:5)

我会看一下你的数据库的设计。如果另一个问题变得明显,那么在每个问题上都有一个包含单独列的表将是一个非常令人头痛的问题。

我可能会使用四个表:

  • 用户:UserID(AutoNum, PK ),用户名(文字)
    enter image description here
  • 植物:PlantID(AutoNum, PK ),PlantName(文字)
    enter image description here
  • 问题列表:IssueID(AutoNum, PK ),IssueDescription(文字)
    enter image description here
  • User_Issues :UserID(Num, PK ),PlantID(Num, PK ),IssueID(Num, 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"

这将为植物创建笛卡尔积,并为每个用户创建问题。因此,例如,如果您有两个工厂和三个问题,您将获得2x3记录 - 两个工厂可能存在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