比较每行的每列的两个表,并将结果作为日志变量

时间:2011-11-16 17:30:57

标签: sql sql-server-2008

我需要比较每行中的两个表。表格如下: -

表a:

ID  First_Name       Last_name                         Birthdate
1   Shradha         Deshkmukh                       1981-12-25 00:00:00
2   Shradha              Verma                      1981-05-11 00:00:00
3   Divya                 Dutta                     1982-07-21 00:00:00
4   Matthew               Palmer                         1983-12-28 00:00:00

表d: -

 id fn  ln  dob
 1  Shradha Tiwari  1981-12-25 00:00:00
 2  Divya   Dutta   1983-07-21 00:00:00
 3  Sulabh  Manesar 1975-09-11 00:00:00
 4  Matthew Palmer  1983-12-28 00:00:00
 5  Samuel  Maxwell 1984-05-22 00:00:00

现在我的原始表有大约17列,这只是它的一个更简单的版本。表'A'和'D'由查询生成。表'A'将被填充,表D将像一个临时表,从查询中获取其值,比较每个表的所有名字,如果遇到任何更改,它需要更新日志表的名字并且还提到了所有不同的列。

为此,我创建了一个临时表,即。 '#TMP_COMPARE'占用表'a'的所有列。然后将这些列与表'd'的列进行比较,它的列PLN,PDOB,Pmatch默认值为0,如果所有列都匹配该行,则设置为1(Pmatch = 1),姓氏匹配(PLN = 1),Dob匹配(Pdob = 1)。

一旦'#TMP_COMPARE'比较了两个表,我就会用不匹配名字的列更新日志表。

USE Testing
GO

IF OBJECT_ID('TEMPDB..#TMP_COMPARE') is not null
BEGIN
DROP TABLE #TMP_COMPARE
END 

CREATE TABLE #TMP_COMPARE(
FN varchar(20),
LN varchar(20),
dob smalldatetime,
PLN int default 0,
Pdob int default 0,
 Pmatch int default 0)

BEGIN
INSERT INTO #TMP_COMPARE
SELECT a.fn, a.ln, a.dob, 
case when a.ln = d.Last_name AND a.dob = d.Birthdate
        THEN 1          
        END AS #TMP_COMPARE.PMATCH,
 CASE WHEN a.dob <> d.Birthdate
        THEN 0  
         WHEN a.dob = d.Birthdate then 1 
        END AS #TMP_COMPARE.Pdob,           

 CASE WHEN a.ln <> d.Last_name 
        THEN 0
          WHEN a.ln = d.Last_name            
    then 1          
 END AS #TMP_COMPARE.PLN

FROM dbo.a2 as a  
 JoIN  d ON a.fn = d.First_Name     
END 

SELECT * FROM #TMP_COMPARE

我得到的错误是: -

Msg 102, Level 15, State 1, Line 24
Incorrect syntax near '.'

我的查询有什么问题,如果我以任何其他方式执行此操作,请提供建议。 现在这是我的查询中非常基本的错误,但我是新手,非常感谢任何帮助。

提前致谢, DCS

2 个答案:

答案 0 :(得分:0)

@log是单个标量变量值,并且在给定时间只能保存单个值。因此,您无法引用该变量的先前值,只是当前存在的值。

这意味着它只会显示select语句中每条记录的最后一个值(匹配)。

您可能希望在循环内移动选择并将其更改为插入到某种日志记录表中。这样,您可以在循环结束后从loggingset中选择*以检索所有数据。

有可能有更好的方法来处理这个问题,但我想快速回复(现在没时间重构)。

答案 1 :(得分:0)

您可以使用两个字符的数据字段来存储结果。

Position 1 = LN match state
Position 2 = Birthdate match state

11 = LN Match True ; Birthday Match True
10 = LN Match True ; Birthday Match False
01 = LN Match False; Birthday Match True
00 = LN Match False; Birthday Match True