基于用户输入访问权限的SQL动态查询问题

基于用户输入访问权限的SQL动态查询问题,sql,ms-access,Sql,Ms Access,我有一张表格,联系信息 我有一个供用户输入的表单,frmSearch 我有一个问题的主题,frmSearchQuery 表中有关于居民的数据,包括第一、最后、电话、电子邮件、地址等。以及大约25种混合教育和技能 用例 我的想法是,我的客户可以用一种傻瓜式的方式勾选一些方框,它会把那些掌握了选定技能的居民吐出来,然后他们可以提供给潜在雇主(第8节/低收入住房,我的客户试图帮助他们的居民找到稳定的工作) 示例用例是我选择GED和HVAC,并列出所有具有GED和HVAC经验的居民 我有一个SQL查

我有一张表格,
联系信息

我有一个供用户输入的表单,
frmSearch

我有一个问题的主题,
frmSearchQuery

表中有关于居民的数据,包括第一、最后、电话、电子邮件、地址等。以及大约25种混合教育和技能


用例

我的想法是,我的客户可以用一种傻瓜式的方式勾选一些方框,它会把那些掌握了选定技能的居民吐出来,然后他们可以提供给潜在雇主(第8节/低收入住房,我的客户试图帮助他们的居民找到稳定的工作)

示例用例是我选择
GED
HVAC
,并列出所有具有GED和HVAC经验的居民


我有一个SQL查询,它显然不能按照我想要的方式工作,我正在绞尽脑汁思考如何编写它,这样基本上如果在form=true和
resident skill=true
上选择了
skill,那么它将匹配查询参数

使用下面的代码,我离目标有多近

SELECT *
FROM [Contact Info]
WHERE (Forms!frmSearch!chk_someschool = True AND [Some School] = True)
  AND (Forms!frmSearch!chk_ged  = True AND [GED] = True)
  AND (Forms!frmSearch!chk_highschool  = True AND [High School Diploma] = True)
  AND (Forms!frmSearch!chk_somecollege  = True AND [Some College] = True)
  AND (Forms!frmSearch!chk_certificate  = True AND [Certificate] = True)
  AND (Forms!frmSearch!chk_associates  = True AND [Associate Degree] = True)
  AND (Forms!frmSearch!chk_bachelors  = True AND [Bachelor Degree] = True)
  AND (Forms!frmSearch!chk_masters  = True AND [Masters Degree] = True)
  AND (Forms!frmSearch!chk_accounting  = True AND [Accounting/Bookeeping] = True)
  AND (Forms!frmSearch!chk_admin  = True AND [Administrative/Clerical/Office Training] = True)
  AND (Forms!frmSearch!chk_computer  = True AND [Computer Skills] = True)
  AND (Forms!frmSearch!chk_plumbing  = True AND [Plumbing] = True)
  AND (Forms!frmSearch!chk_concrete  = True AND [Concrete Finishing] = True)
  AND (Forms!frmSearch!chk_groundskeeping  = True AND [Grounds Keeping] = True)
  AND (Forms!frmSearch!chk_HVAC  = True AND [HVAC] = True)
  AND (Forms!frmSearch!chk_casemanagement  = True AND [Case Management] = True)
  AND (Forms!frmSearch!chk_roofer  = True AND [Roofer] = True)
  AND (Forms!frmSearch!chk_carpentry  = True AND [Carpentry] = True)
  AND (Forms!frmSearch!chk_electrical  = True AND [Electrical] = True)
  AND (Forms!frmSearch!chk_bricklayer  = True AND [Brick Layer] = True)
  AND (Forms!frmSearch!chk_receptionist  = True AND [Receptionist] = True)
  AND (Forms!frmSearch!chk_heavyequipment  = True AND [Heavy Equipment Operation] = True)
  AND (Forms!frmSearch!chk_painting  = True AND [Painting] = True)
  AND (Forms!frmSearch!chk_drywall  = True AND [Dry Wall Installation] = True)
  AND (Forms!frmSearch!chk_sheetmetal  = True AND [Sheet Metal Work] = True);
编辑

@安德烈实际上在早些时候帮了我,下面是,但它只匹配每一个被检查的技能/教育的居民。我试图搞乱布尔值,看看是否得到不同的结果,但忘记粘贴提供给我的原始语句

SELECT *
FROM [Contact Info]
WHERE (Forms!frmSearch!chk_someschool = False OR [Some School] = True)
  AND (Forms!frmSearch!chk_ged  = False OR [GED] = True)
  AND (Forms!frmSearch!chk_highschool  = False OR [High School Diploma] = True)
  AND (Forms!frmSearch!chk_somecollege  = False OR [Some College] = True)
  AND (Forms!frmSearch!chk_certificate  = False OR [Certificate] = True)
  AND (Forms!frmSearch!chk_associates  = False OR [Associate Degree] = True)
  AND (Forms!frmSearch!chk_bachelors  = False OR [Bachelor Degree] = True)
  AND (Forms!frmSearch!chk_masters  = False OR [Masters Degree] = True)
  AND (Forms!frmSearch!chk_accounting  = False OR [Accounting/Bookeeping] = True)
  AND (Forms!frmSearch!chk_admin  = False OR [Administrative/Clerical/Office Training] = True)
  AND (Forms!frmSearch!chk_computer  = False OR [Computer Skills] = True)
  AND (Forms!frmSearch!chk_plumbing  = False OR [Plumbing] = True)
  AND (Forms!frmSearch!chk_concrete  = False OR [Concrete Finishing] = True)
  AND (Forms!frmSearch!chk_groundskeeping  = False OR [Grounds Keeping] = True)
  AND (Forms!frmSearch!chk_HVAC  = False OR [HVAC] = True)
  AND (Forms!frmSearch!chk_casemanagement  = False OR [Case Management] = True)
  AND (Forms!frmSearch!chk_roofer  = False OR [Roofer] = True)
  AND (Forms!frmSearch!chk_carpentry  = False OR [Carpentry] = True)
  AND (Forms!frmSearch!chk_electrical  = False OR [Electrical] = True)
  AND (Forms!frmSearch!chk_bricklayer  = False OR [Brick Layer] = True)
  AND (Forms!frmSearch!chk_receptionist  = False OR [Receptionist] = True)
  AND (Forms!frmSearch!chk_heavyequipment  = False OR [Heavy Equipment Operation] = True)
  AND (Forms!frmSearch!chk_painting  = False OR [Painting] = True)
  AND (Forms!frmSearch!chk_drywall  = False OR [Dry Wall Installation] = True)
  AND (Forms!frmSearch!chk_sheetmetal  = False OR [Sheet Metal Work] = True);
编辑2:

这是表格。默认状态false,三重状态编号。 一切都没有检查。不管我在这个表格中检查了什么,因为结果总是一样的

当我运行它时,我只得到一个结果,一个所有内容都设置为check(设置为TRUE)的伪条目。

不知道为什么!这是我第一次编辑下的查询

如果我尝试在只勾选“Associates Degree”的情况下运行搜索,我应该会得到三个结果。两个实际条目有一个Associates和我的虚拟条目,但是,只有虚拟条目显示。

正如我在原稿中所写,逻辑只有在每个技能的子句中包含
时才有效

此外,搜索框的复选框必须为FALSE,而不是TRUE

SELECT *
FROM [Contact Info]
WHERE (Forms!frmSearch!chk_someschool = False OR [Some School] = True)
  AND (Forms!frmSearch!chk_ged        = False OR [GED] = True)
  AND (...
                                          ^   ^
                                          |   |
也许它有助于理解逻辑,将其颠倒过来:

布尔逻辑表示:
(A或B)==not(非A和非B)

i、 e.您不想列出记录,您在其中搜索某项技能,而此人不具备该技能

i、 e


编辑:事实证明,在查询和表单中,有两个复选框的名称不同

Form:  chk__concrete
Query: chk_concrete

Form:  chk_carpet
Query: chk_carpentry 
Access在运行查询时不请求这些参数,这有点令人恼火。相反(我猜)它会默默地将其视为NULL,而这些子句不起作用


在表单设计中更正这些复选框名称,查询就会起作用。

此外,列出的“技能”确实有点无处不在,但这正是客户想要的,这些都是提供给所有居民的纸质清单上列出的技能。使用多个表示相同类型数据的是/否字段不是标准化结构,尝试应用筛选标准总是会失败。但是“不完全按照我想要的方式工作”是什么意思?输出有什么问题?@June7,只是我当前的SQL查询与我想要的结果不匹配。我不熟悉SQL和Access(显然是哈哈!),也不理解规范化结构的含义。我的客户有一群住院医生,他们要么有(正确的)特定技能,要么没有(错误的)。为什么复选框不适用于真/假值?您应该研究“规范化”。我并没有说true/false复选框有任何错误,我说非规范化数据结构的多个yes/no字段在尝试过滤时会令人沮丧。另外,我不使用动态参数化查询-我使用VBA构建筛选条件并应用于表单或报表。对!我尝试了你最初建议的方法,但唯一能匹配桌子上的东西的方法是,如果我做了一个检查了所有技能/教育的虚拟居民。表单的内容(true或false)无关紧要,它将始终显示一个虚拟驻留。确保所有复选框都有
DefaultValue=false
TripleState=false
。那么它一定会起作用@Ghawblin很好奇。一切似乎都是正确的。你能复制你的数据库,删除所有的个人信息(只需在其中留下2-3条测试记录),压缩并压缩它,然后像这样上传到文件宿主,这样我就可以看一看了吗@加布林威尔。此方法仅在查询中的所有控件名称实际存在时有效,请参见编辑。我没有单词。我是世界上最大的狗。你帮了我度过了大部分时间,非常感谢。在这一点上,我只需要建立了前端更多,所以它看起来不错。我很尴尬,我需要这么多的人手,但我更聪明。我希望你有一个美好的假期,非常感谢你。这个项目将帮助我所在社区的许多人。这是为当地住房管理局,需要政府援助生活的人准备的。我吃得太多了。我从事网络安全工作,根本不使用SQL。非常感谢。
Form:  chk__concrete
Query: chk_concrete

Form:  chk_carpet
Query: chk_carpentry