我需要在访问追加查询

时间:2015-05-19 13:38:49

标签: sql-server database

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

发票项目表= LineItemID | ProjectID |项目名称| HoursID |调查员|工作日期|可结算时间| WorkCode | WorkCodeText |充电|总费用

查询从两个表中获取字段,以使用以下参数插入到行项目表中:

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]
                )
            )
        );

一切都很好,除了最后一部分,我尝试添加一个不同的小时表ID字段选择,该字段运行但不产生预期的结果。如果通过子表单将记录添加到小时表并运行追加查询,我将获得所有记录,而不仅仅是新记录。我希望能够添加新记录并保存并关闭"我将触发追加查询仅添加新记录。 感谢您接受这一挑战。 样本数据是小时表有两个数据的记录,其中每个列的小时ID是43,而其他数据并不重要,所以我不会厌倦所有列数据。重新运行追加查询以前会添加另外两个具有相同数据和ID的记录43和8.如果插入的记录已存在于发票行项目表中,我现在不会添加任何记录。

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

我没有意识到我需要第二个SELECT语句来比较目标表中的小时ID和小时ID值。它适用于此表和查询,但不适用于我的其他类似的,但我想我在这里错过了树林。如果有人想要刺它,也许你可以发现我的错误。

这个有下表: [项目费用]。员工,[项目费用]。[费用日期],[项目费用]。[费用代码],[项目费用]。安装,[项目费用]。安装,ID

SQL: INSERT INTO tblInvoiceLineItems(ProjectID,ProjectName,Investigator,ExpenseDate,ExpenseCode,ExpenseAmount,TotalCharges,ExpensesID) SELECT Projects.ID,Projects。[Project Name],[Project Expenses] .Employee,[Project Expenses]。[Expense Date],[Project Expenses]。[Expense Code],[Project Expenses] .Amount,[Project Expenses] .Amount,[项目费用] .ID FROM项目LEFT JOIN [项目费用] ON Projects.ID = [项目费用] .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)= [输入id])AND([项目费用]。[ID]<>(SELECT [tblInvoiceLineItems]。[ExpensesID] FROM [tblInvoiceLineItems])));

所以我做了一个类似的SELECT语句来比较插入的Expense ID和已经插入到同一Invoice items表中的Expense ID。但是,当我重新运行追加查询时,我收到一条消息"最多只会添加一条记录",但之后不会添加任何记录。这部分发票中有两条ID为2和16的记录。

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

1 个答案:

答案 0 :(得分:0)

快速浏览一下我猜测[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]
            )
        )
    );

我添加了hoursid不为null,因为没有,因为有些"有趣"如果那里有空值的话。