Sql 仅当';不存在于Access 2007中

Sql 仅当';不存在于Access 2007中,sql,ms-access,Sql,Ms Access,我有一个表,假设它存储员工姓名(这不是确切的情况,但概念是相同的),主键设置为自动编号。在添加新员工时,我希望在添加之前检查数据库中是否存在该名称,如果该名称已经存在,可能会给出一个错误。如何从表的常规add表单执行此操作 我尝试为它创建一个查询,但这不起作用,因为表单基于表,不能使用查询作为控制源。我在网上看到一些例子,说如何用VB代码做类似的事情,但我无法让它工作,因为这不是一个简单的例子,有些行被遗漏了 有什么简单的方法可以做到这一点吗?在“表设计”视图中,您可以将名称列编入索引而不重复

我有一个表,假设它存储员工姓名(这不是确切的情况,但概念是相同的),主键设置为自动编号。在添加新员工时,我希望在添加之前检查数据库中是否存在该名称,如果该名称已经存在,可能会给出一个错误。如何从表的常规add表单执行此操作

我尝试为它创建一个查询,但这不起作用,因为表单基于表,不能使用查询作为控制源。我在网上看到一些例子,说如何用VB代码做类似的事情,但我无法让它工作,因为这不是一个简单的例子,有些行被遗漏了


有什么简单的方法可以做到这一点吗?

在“表设计”视图中,您可以将名称列编入索引而不重复


然后Access本身将拒绝该条目。但是,我认为在拒绝输入之前,它将使用其中一个自动编号。

在将记录插入数据库之前,您正在处理预鉴定记录的问题。可以通过数据库约束来处理您永远不会违反的简单而绝对的规则(比如从不、永远、永远允许使用相同名称的记录),在这种情况下,可以在相关列上创建一个索引,并将AllowDuplicates设置为No

然而,在现实世界中,资格预审通常更为复杂。您可能需要简单地警告用户可能存在重复记录,但仍允许他们添加记录。您可能需要检查其他表的某些情况,或者一次收集多个表的信息

在这些情况下,您需要编写接口,使其不直接绑定到表(在Access术语中,创建一个记录源为空的表单),在各种控件中收集信息,在代码中执行检查(通常使用DCOUNT和DLOOKUP),然后使用DoCmd.RunSQL在代码中发出一系列INSERT和UPDATE语句


您可以偶尔使用一些技巧来避免在前端编写代码,但迟早你会遇到需要这种编码级别的情况。

最好的解决方案是让用户输入名字和姓氏的几个字符,并根据这些搜索条件显示所有个人的连续形式。同时显示相关信息,如中间名(如有)、电话号码和地址,以消除潜在的重复项。然后,如果没有找到副本,他们可以添加此人

每个镇上都会有两个约翰·史密斯或简·琼斯


我读到过这样一种情况,两个名字、姓氏和出生日期完全相同的妇女在塞姆蒂姆的一家医院里。这真的很可怕。

我将投票支持使用未绑定表单收集所需字段并显示可能的副本。以下是最近一个应用程序的示例:


(来源:)

(我把真人的名字编辑出来,放进了假的东西,我的图形程序的反走样与ClearType的不同,因此很奇怪)

这里的想法是,用户将数据放入四个字段中的任何一个(对所有字段都没有要求),然后单击ADD按钮。第一次,它填充可能的匹配项。然后,用户必须确定其中一个匹配项是否为目标用户,然后再次单击“添加”(添加该匹配项,即使是重复的),或者单击底部的按钮转到所选客户

彩色指示器用于表示比赛的接近程度。在这种情况下,输入的电子邮件地址与列出的第一个人完全匹配,电子邮件上的完全匹配本身被视为完全匹配。此外,在这个特定的应用程序中,客户希望尽可能减少多人进入同一家公司(这是他们业务的性质),因此组织上的精确匹配被视为部分匹配

除此之外,还有使用Soundex、Soundex2和Simil的匹配,以及与Soundex/Soundex2/Simil组合的子字符串和子字符串。在本例中,第二个条目是重复的,但是Soundex和Soundex2没有捕捉到它,而Simil返回67%的相似性,我将灵敏度设置为大于50%,因此“Wightman”显示为与“Whiteman”非常匹配。最后。我不知道为什么最后两个会出现在列表中,但显然有一些原因(可能是明喻和首字母)

我通过评分程序运行姓名、公司和电子邮件,然后使用组合计算最终分数。我在每个个人记录中存储Soundex和Soundex2值。当然,Simil必须在运行中进行计算,但它工作正常,因为Jet/ACE查询优化器知道限制其他字段,因此调用Simil以获得大大减少的数据集(这实际上是我使用Simil的第一个应用程序,到目前为止工作得很好)


加载可能的匹配项需要一点暂停,但速度并不是太慢(这个版本的应用程序有大约8K条现有记录正在测试)。我为一个在person表中有25万条记录的应用程序创建了这个设计,当后端仍然是Jet时,它工作得很好,并且在几年前将后端升级到SQL Server后仍然工作得很好。

这在SQL世界中被称为“
UPSERT
”。ISO/ANSI SQL-99标准定义了最近添加到SQL Server 2008的
合并
语法,并对该标准进行了专有扩展。令人高兴的是,SQL世界正沿着MySQL开辟的道路前进

不幸的是,Access数据库引擎是一个完全不同的故事。即使是简单的
UPDATE
也不支持SQL-92标量子查询语法,相反,它有自己的语法,并且是任意(不可预测?当然没有文档记录)结果的专有语法。窗户