【问题标题】:I need to prevent duplicates in an access append query我需要防止访问附加查询中的重复
【发布时间】:2015-05-19 13:38:48
【问题描述】:

我已经编写了附加查询,它从两个子表单中获取记录并将它们插入到发票项目表中。使用任一查询,结果都是相同的,正是我想要的,除了如果在添加新记录后再次运行它,它将创建已添加记录的副本。 我尝试在子表单 (Hours.ID) 的 ID 字段的 where 子句中使用 SELECT DISTINCT,但它没有改变结果。见下文。

发票项目表 = LineItemID |项目ID |项目名称 |营业时间ID |调查员 |工作日期 |计费时间 |工作代码 |工作代码文本 |收费 |总费用

查询从两个表中抓取字段以插入到带有这些参数的行项目表中:

INSERT INTO tblInvoiceLineItems (
    ProjectID
    ,ProjectName
    ,Investigator
    ,DateWorked
    ,BillableHours
    ,Charge
    ,TotalCharges
    ,WorkCode
    ,[WorkCodeText]
    ,HoursID
    )
SELECT [Project Hours].Project
    ,[Project Hours].ProjectName
    ,[Project Hours].Investigator
    ,[Project Hours].[Date Worked]
    ,[Project Hours].[Billable Hours]
    ,tblWorkCodes.Charge
    ,[Project Hours] ! [Billable Hours] * [tblWorkCodes] ! [Charge] AS [Total Service Charges]
    ,[Project Hours].[Work Code]
    ,tblWorkCodes.WorkCode
    ,[Project Hours].ID
FROM tblWorkCodes
INNER JOIN [Project Hours] ON tblWorkCodes.WorkCodeID = [Project Hours].[Work Code]
WHERE (
        (([Project Hours].Project) = [Enter ID])
        AND (
            ([Project Hours].ID) IN (
                SELECT DISTINCT [Project Hours].ID
                FROM [Project Hours]
                )
            )
        );

除了最后一部分我尝试添加一个不同的 Hour table ID 字段选择之外,一切都很好,它运行但不会产生预期的结果。如果通过子表单将记录添加到小时表并运行附加查询,我将获得所有记录,而不仅仅是新记录。我希望能够添加新记录并“保存并关闭”,从而触发追加查询以仅添加新记录。 感谢您接受这个挑战。 示例数据是 hours 表的每一列都有两条数据记录,其中 Hours ID 为 43 和 8。其他数据无关紧要,所以我不会让任何人对所有列数据感到厌烦。重新运行附加查询之前将添加两条具有相同数据和 ID 43 和 8 的记录。使用下面的新解决方案,如果发票行项目表中已存在被插入的记录,我现在不会添加任何记录。

好的,我现在确实通过在 AND 之后插入以下内容来解决这个问题“ ("ID"(SELECT [tblInvoiceLineItems].[HoursID] FROM [tblInvoiceLineItems])));

我没有意识到我需要第二个 SELECT 语句来比较 Hours ID 和目标表中的 Hours ID 值。它适用于该表和查询,但不适用于我的另一个类似的表,但我想我在这里错过了树木的森林。如果有人想尝试一下,也许你会发现我的错误。

这个有下表: [项目费用].员工、[项目费用].[费用日期]、[项目费用].[费用代码]、[项目费用].金额、[项目费用].金额、ID

SQL: 插入 tblInvoiceLineItems(项目 ID、项目名称、调查员、费用日期、费用代码、费用金额、总费用、费用 ID) SELECT Projects.ID, Projects.[项目名称], [项目费用].Employee, [项目费用].[费用日期], [项目费用].[费用代码], [项目费用].金额, [项目费用] .Amount, [项目费用].ID FROM Projects LEFT JOIN [Project Expenses] ON Projects.ID = [Project Expenses].Project GROUP BY Projects.ID, Projects.[Project Name], [Project Expenses].Employee, [Project Expenses].[Expense Date], [Project Expenses].[Expense Code], [Project Expenses].Amount, [Project Expenses ]。ID HAVING (((Projects.ID)=[enter id]) AND ([Project Expenses].[ID](SELECT [tblInvoiceLineItems].[ExpensesID] FROM [tblInvoiceLineItems])));

所以我做了一个类似的 SELECT 语句来比较插入的费用 ID 和已经插入同一个发票项目表的费用 ID。但是,当我重新运行附加查询时,我收到一条消息“最多将添加一条记录”,但随后没有添加任何记录。这部分发票有两条 ID 分别为 2 和 16 的记录。

可能我的整个方法是将两个表中的记录合并到一个发票行项目表中,我可以从中显示行项目和发票/报告的总数。即使有人有更好的想法,如果我需要它作为唯一或最佳解决方案,我发现学习这种附加技术很有价值。 感谢所有做出贡献的人。

【问题讨论】:

  • 如果不看就几乎不可能诊断:1) 样本数据,2) 当前结果,3) 所需结果。

标签: sql-server database


【解决方案1】:

快速浏览一下,我猜 [Project Hours].ID 应该只进入 tblInvoiceLineItems 表一次??

要不要改成

INSERT INTO tblInvoiceLineItems (
ProjectID
,ProjectName
,Investigator
,DateWorked
,BillableHours
,Charge
,TotalCharges
,WorkCode
,[WorkCodeText]
,HoursID
)
SELECT DISTINCT [Project Hours].Project
,[Project Hours].ProjectName
,[Project Hours].Investigator
,[Project Hours].[Date Worked]
,[Project Hours].[Billable Hours]
,tblWorkCodes.Charge
,[Project Hours] ! [Billable Hours] * [tblWorkCodes] ! [Charge] AS [Total Service Charges]
,[Project Hours].[Work Code]
,tblWorkCodes.WorkCode
,[Project Hours].ID
FROM tblWorkCodes
INNER JOIN [Project Hours] ON tblWorkCodes.WorkCodeID = [Project Hours].[Work Code]
WHERE [Project Hours].ID NOT IN (SELECT HoursID FROM tblInvoiceLineItems  where hoursID is not null) AND (
    (([Project Hours].Project) = [Enter ID])
    AND (
        ([Project Hours].ID) IN (
            SELECT DISTINCT [Project Hours].ID
            FROM [Project Hours]
            )
        )
    );

我在 not in 中添加了 hoursid is not null ,因为如果里面有 null 值,not in 会做一些“有趣”的事情。

【讨论】:

  • 感谢您使用 NOT NULL 的建议,我将尝试将其放入我在上面创建的解决方案中,该解决方案在 WHERE 之后读取:((([Project Hours].Project)=[Enter ID ]) AND ("ID"(SELECT [tblInvoiceLineItems].[HoursID] FROM [tblInvoiceLineItems])));不等于 我应该改用它吗?
  • 再次感谢安德鲁!我删除了我的解决方案并测试了你的解决方案,它运行良好,我认为你的解决方案更好,所以我改用它。我还对其进行了调整以适用于 Project Expenses 表插入,如下所示: WHERE [Project Expenses].ID NOT IN (SELECT ExpensesID FROM tblInvoiceLineItems where ExpensesID is not null) AND (( [Project Expenses].Project) = [Enter ID] );我希望我能像你帮助我一样帮助别人。我当然很感激,我会回答我能回答的任何问题。 ,关于我能做的任何话题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-24
  • 2015-09-26
  • 1970-01-01
  • 2016-10-24
  • 1970-01-01
  • 2016-03-26
相关资源
最近更新 更多