2017-06-13 270 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! 您的想法完全適合我! –