我需要比较每行中的两个表。表格如下: -
表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
答案 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