2013-07-04 2 views
1

Постараюсь объяснить, но если это неясно, сообщите мне. Английский не мой первый язык.Построить запрос как условие для вставки набора записей

Мне нужна помощь с запросом, который служил бы условием вставить набор записей или нет.

Во-первых, у меня есть таблица db EmployeeProviders.

В одной из хранимых процедур я пересчитываю кредиты в соответствии с некоторыми условиями. Записи устанавливаются в количествах в этом случае три, но могут быть более или менее.

Если после пересчета я получаю точно такие же цифры или кредиты с той же датой вступления в силу, что и у EmployeeProviders, мне не нужно вставлять эти значения. EmployeeProviders может содержать несколько наборов записей для каждого сотрудника, отделенного действительной датой.

Сложность для меня заключается в построении запроса, который будет проверять записи не один за другим, а в наборах из трех в этом случае. Если одна из записей не соответствует, мне нужно вставить все три. Если все они одинаковые, я не вставляю никаких записей.

declare @StartDate datetime, @employee_id int 
select @StartDate = '2013-07-01', @employee_id = 3465 

Например здесь таблица БД заполняются значениями

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 

caclulation После всех обновлений сумм в этой темп таблицы такие же, как и в таблице БД EmployeeProviders так, мне не нужно, чтобы вставить новый набор записей Как я могу сделать один запрос, который может либо должно быть как ЕСЛИ НЕ СУЩЕСТВУЕТ() или просто сделать INSERT EmployeeProviders() ... SELECT ... FROM @Providers ,,, - запрос, который вернет мне набор из 3 записей, если значения не являются такие же, как у EmployeeProviders

Другой сценарий, @ Providers.credits = 65, так как сумма изменений d сравнить EmployeeProviders.credits для ид = 16. Я добавлю новый набор из 3 записей в таблице EmployeeProvider

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

+0

ваш вопрос по-прежнему неясен. не могли бы вы объяснить это больше? –

+0

Если результат из обеих таблиц одинаковый, идентификаторы и суммы для них одинаковы, мне не нужно вставлять новые записи в EmployeeProviders. Например, EmployeeProviders.id = Providers.id и EmployeeProviders.credits = Providers.credits для EmployeeProviders.effective_date = 1 июля 2013 года. Все три записи должны быть одинаковыми. Если Providers.credits после пересчета для одной из записей будет 65, тогда я добавлю новый набор из 3 записей. – user2551472

+0

. Уникальный идентификатор для каждой строки из 3-х записей - «id» – user2551472

ответ

0

Я возьму удар в Это. Попробуйте это в хранимой процедуре:

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 

Смотрите в action

1

Если я правильно понимаю ваш вопрос, ваша проблема может быть решена путем создания вашей вставки обусловливающие исход Except

if exists(
select ID, plan_id , credits from @Providers 
except 
SELECT id, plan_id, credits FROM @EmployeeProviders WHERE plan_id = 18753 and datediff(dd,effective_date,@StartDate) = 0 
) 
0

используйте что-то вроде следующего запроса. Я сделал это обобщением для вас. Проверь это .

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 
Смежные вопросы