Как проверить, существует ли значение строки для каждого пользователя в базе данных - PullRequest
0 голосов
/ 05 марта 2012

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

У меня есть таблица журнала контактов с клиентами, в которую вводятся все контакты.

У меня настроен почтовый сценарий в mssql2005, который отправляет список в ящик электронной почты менеджера, когда контакт не был установлен илижурнал был введен после 90-дневного периода.

Я борюсь с sql, чтобы определить, если контакт не существует или он существует, но нарушен, пожалуйста, посмотрите на мой скрипт ниже:

Я попытался сделать это какнасколько это возможно для чтения.

DECLARE @tmp INT 

SELECT m.id                                                          AS 
       [Case ID], 
       CONVERT(VARCHAR, userdbjhv25.dbo.Calcdate(oc.firstdate), 103) AS 
       [Target Contact Date] 
FROM   userdbjhv25.dbo.USER v, 
       userdbjhv25.dbo.customer o, 
       userdbjhv25.dbo.maincase m, 
       userdbjhv25.dbo.usercase vc, 
       userdbjhv25.dbo.customercase oc, 
       contactlist r 
WHERE  m.id = vc.caseid 
       AND v.userid = vc.userid 
       AND m.id = oc.caseid 
       AND o.customerid = oc.customerid 
       AND userdbjhv25.dbo.Calcdate(oc.firstdate) <= Getdate() 
       AND ( @tmp IS NOT NULL 
             AND NOT EXISTS (SELECT 1 
                             FROM   contactlist r1 
                             WHERE  r1.caseno = vc.usercase 
                                    AND r1.conlogtype = 'Initial Contact') 
              OR (( @tmp IN(SELECT 1 
                            FROM   contactlist r2, 
                                   usercase vc2, 
                                   USER v2, 
                                   customercase oc2, 
                                   maincase m2, 
                                   customer o2 
                            WHERE  m2.id = oc2.caseid 
                                   AND o2.customerid = oc2.customerid 
                                   AND r2.conlogtype = 'Initial Contact' 
                                   AND r2.caseno = vc.usercase 
                                   AND 
                           userdbjhv25.dbo.Calcdate(oc2.firstdate) < r2.postdate 
                           ) 
                  )) ) 

1 Ответ

0 голосов
/ 05 марта 2012

Я думаю, что левое соединение станет вашим другом здесь.Я не могу достаточно визуализировать вашу схему, но идея левого (или правого) соединения состоит в том, что данные могут не существовать ни в одном из наборов данных.Когда это происходит, возвращается строка, полная нулей.Однако, когда оно совпадает, вы возвращаете данные, которые совпадают.Итак, некоторый пседокод:

select m.id  AS [Case ID], 
       CONVERT(VARCHAR, userdbjhv25.dbo.Calcdate(oc.firstdate), 103) AS [Target Contact Date]
from userdbjhv25.dbo.customer o
left join userdbjhv25.dbo.customercase oc
    on o.customerid = oc.customerid
where oc.firstdate is null or datediff(day, oc.firstdate, getdate()) > 90

Адаптируйте это к своей схеме, и вам будет хорошо.

...