Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 构造一个查询作为插入一组记录的条件_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql 构造一个查询作为插入一组记录的条件

Sql 构造一个查询作为插入一组记录的条件,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我会尽力解释,但如果不清楚,请让我知道。英语不是我的第一语言 我需要一些关于查询的帮助,该查询将作为插入或不插入记录集的条件 首先,我有一个db表EmployeeProviders 在其中一个存储过程中,我根据某些条件重新计算积分。在本例中,记录的数量设置为三个,但可以或多或少 如果重新计算后,我得到的数字或学分与EmployeeProviders中的数字或学分的生效日期完全相同,我不需要插入这些值。EmployeeProviders可能包含按生效日期分隔的每个员工的几组记录 对我来说,困难在于

我会尽力解释,但如果不清楚,请让我知道。英语不是我的第一语言

我需要一些关于查询的帮助,该查询将作为插入或不插入记录集的条件

首先,我有一个db表EmployeeProviders

在其中一个存储过程中,我根据某些条件重新计算积分。在本例中,记录的数量设置为三个,但可以或多或少

如果重新计算后,我得到的数字或学分与EmployeeProviders中的数字或学分的生效日期完全相同,我不需要插入这些值。EmployeeProviders可能包含按生效日期分隔的每个员工的几组记录

对我来说,困难在于构造一个查询,在这种情况下,它不是逐个检查记录,而是一组三个检查记录。如果其中一条记录不匹配,我需要插入所有三条记录。如果它们都相同,我不插入任何记录

declare @StartDate datetime, @employee_id int
select @StartDate = '2013-07-01', @employee_id = 3465
例如,这里是用值填充的db表

    DECLARE @EmployeeProviders TABLE (
    ident_id int IDENTITY,
                employee_id int,
    id int, 
    plan_id int, 
    credits decimal(18,5),
    effective_date datetime                     
)

INSERT INTO @EmployeeProviders (employee_id, plan_id, id, credits, effective_date)
VALUES (18753, 23, 0.00000, '2013-06-01')

INSERT INTO @EmployeeProviders (employee_id, plan_id, id, credits, effective_date)
VALUES (3465, 18753, 15, 0.00000, '2013-06-01')

INSERT INTO @EmployeeProviders (employee_id, plan_id, id, credits, effective_date)
VALUES (3465, 18753, 16, 60.00, '2013-06-01')

INSERT INTO @EmployeeProviders (employee_id, plan_id, id, credits, effective_date)
VALUES (3465, 18753, 23, 0.00000, '2013-07-01')

INSERT INTO @EmployeeProviders (employee_id, plan_id, id, credits, effective_date)
VALUES (3465, 18753, 15, 0.00000, '2013-07-01')

INSERT INTO @EmployeeProviders (employee_id, plan_id, id, credits, effective_date)
VALUES (3465, 18753, 16, 81.580, '2013-07-01')

SELECT * FROM @EmployeeProviders WHERE plan_id = 18753 and datediff(dd,effective_date,@StartDate) = 0
这是存储过程中的临时表。它在计算过程中得到更新

DECLARE @Providers TABLE (
    id int, 
    plan_id int, 
    credits decimal(18,5)                           
)

INSERT INTO @Providers (plan_id, id, credits)
VALUES (18753, 23, 0.00000)

INSERT INTO @Providers (plan_id, id, credits)
VALUES (18753, 15, 0.00000)

INSERT INTO @Providers (plan_id, id, credits)
VALUES (18753, 16, 81.580)

SELECT * FROM @Providers
在此临时表中的所有更新量与db表EmployeeProviders中的更新量相同之后,我不需要插入新的记录集 如何执行一个查询,该查询可以是以下条件之一: 如果不存在 还是就这么做 插入EmployeeProviders。。。 选择从@Providers、、-查询,如果值与EmployeeProviders中的值不同,则返回一组3条记录

另一种情况是@Providers.credits=65,因为与id=16的EmployeeProviders.credits相比,金额发生了变化。我将向EmployeeProvider表中添加一组新的3条记录

    DECLARE @Providers TABLE (
    id int, 
    plan_id int, 
    credits decimal(18,5)                           
)

INSERT INTO @Providers (plan_id, id, credits)
VALUES (18753, 23, 0.00000)

INSERT INTO @Providers (plan_id, id, credits)
VALUES (18753, 15, 0.00000)

INSERT INTO @Providers (plan_id, id, credits)
VALUES (18753, 16, 65.00)

SELECT * FROM @Providers
提前谢谢大家,


Mak

我要试试看。在存储过程中尝试以下操作:

if (EXISTS(select 3465,pr.plan_id,pr.id,epr.credits,effective_date from
   providers pr left join @EmployeeProviders epr on
   pr.id = epr.id and pr.plan_id = epr.plan_id and pr.credits = epr.credits and    effective_date = '2013-07-01'
   where epr.credits is NULL ))
 INSERT INTO @EmployeeProviders (employee_id, plan_id, id, credits, effective_date)
 select 3463,plan_id,id,credits,'2013-07-01' from @Providers

请看

我要试试看。在存储过程中尝试以下操作:

if (EXISTS(select 3465,pr.plan_id,pr.id,epr.credits,effective_date from
   providers pr left join @EmployeeProviders epr on
   pr.id = epr.id and pr.plan_id = epr.plan_id and pr.credits = epr.credits and    effective_date = '2013-07-01'
   where epr.credits is NULL ))
 INSERT INTO @EmployeeProviders (employee_id, plan_id, id, credits, effective_date)
 select 3463,plan_id,id,credits,'2013-07-01' from @Providers

请参见

如果我正确理解了您的问题,您的问题可以通过将插入条件设置为“例外”的结果来解决


如果我正确理解了您的问题,您的问题可以通过将插入条件设置为Exception的结果来解决


使用类似下面的查询。我为你做了概括。检查一下

WITH TEMP 
AS
(
SELECT A.employee_id, A.plan_id, A.id, A.credits, A.effective_date,CASE WHEN A.CREDITS = B.CREDITS THEN    1 ELSE 0 END AS SAME
FROM @EmployeeProviders as A INNER JOIN @Providers as B ON A.ID = B.ID AND 
A.PLAN_ID = B.PLAN_ID AND A.effective_date = '2013-07-01'
)

SELECT *
FROM TEMP AS A INNER JOIN 
(SELECT EMPLOYEE_ID , PLAN_ID , SUM(SAME) AS TOTAL , COUNT(*) AS CNT FROM TEMP GROUP BY EMPLOYEE_ID ,   PLAN_ID ) AS B  
ON A.EMPLOYEE_ID = B.EMPLOYEE_ID AND A.PLAN_ID = B.PLAN_ID
WHERE B.TOTAL != B.CNT 

使用类似下面的查询。我为你做了概括。检查一下

WITH TEMP 
AS
(
SELECT A.employee_id, A.plan_id, A.id, A.credits, A.effective_date,CASE WHEN A.CREDITS = B.CREDITS THEN    1 ELSE 0 END AS SAME
FROM @EmployeeProviders as A INNER JOIN @Providers as B ON A.ID = B.ID AND 
A.PLAN_ID = B.PLAN_ID AND A.effective_date = '2013-07-01'
)

SELECT *
FROM TEMP AS A INNER JOIN 
(SELECT EMPLOYEE_ID , PLAN_ID , SUM(SAME) AS TOTAL , COUNT(*) AS CNT FROM TEMP GROUP BY EMPLOYEE_ID ,   PLAN_ID ) AS B  
ON A.EMPLOYEE_ID = B.EMPLOYEE_ID AND A.PLAN_ID = B.PLAN_ID
WHERE B.TOTAL != B.CNT 

你的问题还不清楚。你能解释一下吗?如果两个表的结果相同,ID和金额相同,我不需要在EmployeeProviders中插入新记录。例如EmployeeProviders.id=Providers.id和EmployeeProviders.credits=Providers.credits For EmployeeProviders.effective_date=2013年7月1日。所有三条记录必须相同。如果其中一条记录重新计算后的Providers.credits为65,则我将添加一组新的3条记录。3条记录集中每一行的唯一标识符-我还有一个问题您将对同一名员工的信用进行逐行比较,或者您将对同一名员工的信用总额进行比较?您的问题仍然不清楚。你能解释一下吗?如果两个表的结果相同,ID和金额相同,我不需要在EmployeeProviders中插入新记录。例如EmployeeProviders.id=Providers.id和EmployeeProviders.credits=Providers.credits For EmployeeProviders.effective_date=2013年7月1日。所有三条记录必须相同。如果其中一条记录重新计算后的Providers.credits为65,则我将添加一组新的3条记录。3条记录集中每一行的唯一标识符是我还有一个问题,您将逐个比较同一员工的信用,还是比较同一员工的信用总额?