繁体   English   中英

从Excel电子表格将数据加载到Access数据库表中时如何按2个字段进行筛选

[英]How to filter by 2 fields when loading data into an access database table from an excel spreadsheet

好的,这是我的问题,没有因为将公司惯例发布到互联网而被解雇的原因过于具体。

有电子表格。 这些已上传到数据库。 我需要从上传中过滤出重复项。 唯一的方法是确保每个条目的两个字段都与数据库中已有的条目不同。 仅仅因为一个字段是相同的,并不意味着它是重复的。 有两个特定的字段,可以将它们称为FLDA和FLDB,它们都必须与数据库中的一个条目匹配。 我已经可以按一个字段过滤了。 我想这必须是一个子查询,但我不确定如何应用它。 这很难描述。 请问您是否不确定我的意思。

我有一个类似的问题。 我的解决方案是:

  1. 导入到登台表中。
  2. 删除重复项
  3. 将剩余的内容复制到活动表中

这是一个小BFI,但仅能正常工作。

查询适合吗? 例如:

INSERT INTO ToUpdate ( Field1, Field2 )
SELECT e.H1, e.H2
FROM (SELECT * FROM [Sheet1$] IN '' [Excel 8.0;HDR=YES;IMEX=1;database=C:\Docs\LTD.xls]) As e
LEFT JOIN ToUpdate ON (e.H2 = ToUpdate.Field2) AND (e.H1 = ToUpdate.Field1)
WHERE ToUpdate.Field1 Is Null AND ToUpdate.Field2 Is Null

我通过使用删除查询,然后使用Select from Table 1 Group by X Having Y, Z, A进行Select from Table 1 Group by X Having Y, Z, A做到这一点。 然后,我为前端用户放置了运行查询按钮。

为您的所有帮助加油。

您如何将它们加载到数据库中? 这是您自己的代码来读取Excel文件吗? 您可以使用带有正确连接字符串的ADO / ADO.NET读取Excel文件 然后,您可以使用查询来删除重复数据,以读取数据。

Access以CodeSlave的答案为基础,提供了“查找重复项查询”向导,该向导可帮助您轻松构建查询以清除重复项。

另一种方法是在FLDA和FLDB上建立身份。 这将防止重复的条目甚至被写入表中。 当然,您还需要捕获插入操作失败时引发的异常。

是否存在用于识别重复项的字段FLDC? 我认为必须存在,否则使用(FLDA,FLDB)作为唯一键或主键将立即解决您的问题。

假设有这样一个字段,您可以尝试如下操作:

SELECT T1.FLDA, T1.FLDB, T1.FLDC
FROM Table1 T1, Table1 T2
WHERE T1.FLDA = T2.FLDA
  AND T1.FLDB = T2.FLDB
  AND T1.FLDC <> T2.FLDC

不利之处在于,原件和副本都将通过类似的方式返回。 如果您只想查看重复项,则可能必须找出一种方法来标识“原始”行,并为此添加另一个或两个WHERE子句。

如果您可以得到一个只提供重复行而不是原始行的查询,那么将其更改为DELETE查询应该很容易。

为了避免重复输入:

1-如果表上还没有主键,请将其放在FLDA和FLDB上(一起)。 如果已经有一个不是FLDA和FLDB(在一起)的主键,则在这两个字段的表上放置一个索引,唯一的是,忽略空值no。

2-您可以使用向导或查询从电子表格导入表格。 如果使用导入电子表格向导进行操作,则在导入开始之前您将看到以下消息:

“数据库名称无法将所有数据附加到表中。

“由于违反密钥,删除了0条记录中的字段内容,并丢失了(xx)条记录。(这些丢失的记录是重复的,因此在那里没有真正的丢失。)...您是否仍要继续?”

单击“是”以从电子表格导入行。 不会导入任何重复项。

或者,要使用查询进行导入,请将其粘贴到sql视图中的新查询中(菜单:“插入”>“查询”>“设计视图”,“关闭”按钮;菜单:“视图”>“ SQL视图”。)

INSERT INTO tblInput
  SELECT XLS.* 
  FROM tblInput AS T RIGHT JOIN
    [Excel 8.0;IMEX=1;HDR=Yes;DATABASE=c:\data.xls;].[Sheet1$] AS XLS 
    ON T.FLDA = XLS.FLDA AND T.FLDB = XLS.FLDB
  WHERE ISNULL(T.FLDA) AND ISNULL(T.FLDB);

将路径c:\\ data.xls更改为路径,将Sheet1 $更改为工作表名称,将tblInput更改为表名称,将FLDA和FLDB更改为列名称。 如果电子表格没有标题(列名),则将HDR = Yes更改为HDR = No

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM