Sql 构造一个查询作为插入一组记录的条件
我会尽力解释,但如果不清楚,请让我知道。英语不是我的第一语言 我需要一些关于查询的帮助,该查询将作为插入或不插入记录集的条件 首先,我有一个db表EmployeeProviders 在其中一个存储过程中,我根据某些条件重新计算积分。在本例中,记录的数量设置为三个,但可以或多或少 如果重新计算后,我得到的数字或学分与EmployeeProviders中的数字或学分的生效日期完全相同,我不需要插入这些值。EmployeeProviders可能包含按生效日期分隔的每个员工的几组记录 对我来说,困难在于构造一个查询,在这种情况下,它不是逐个检查记录,而是一组三个检查记录。如果其中一条记录不匹配,我需要插入所有三条记录。如果它们都相同,我不插入任何记录Sql 构造一个查询作为插入一组记录的条件,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我会尽力解释,但如果不清楚,请让我知道。英语不是我的第一语言 我需要一些关于查询的帮助,该查询将作为插入或不插入记录集的条件 首先,我有一个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条记录集中每一行的唯一标识符是我还有一个问题,您将逐个比较同一员工的信用,还是比较同一员工的信用总额?