Microsoft SQL Server中此类请求的新功能。我在两个表上使用完全外连接,寻找在右表(新)和左表(旧)中不匹配的记录。我试图从新表中找到新的分数,这样我就可以使用最新的分数更新生产表,同时仍然保留尚未更新的旧分数。这是我的设置
Select
a.customer
,a.date
,a.Cat score
,a.Dog score
,a.Mouse score
,b.customer
,b.date
,b.Cat score
,b.Dog score
,b.Mouse score
From Old Table a
Full Outer Join New Table b
ON a.customer = b.customer
AND a.date = b.date
AND a.Cat score = Cast(b.Cat score as Varchar)
AND a.Dog score = Cast(b.Dog score as Varchar)
AND a.Mouse score = Cast(b.Mouse score as Varchar)
注意---必须将分数转换为Varchar,否则我无法使联接起作用。 "转换varchar值时转换失败' 9.0000'数据类型int。"
结果: 两个列表都是100%不同,没有任何匹配
这不可能,因为我可以手动搜索两个表中的记录,并在两个表中找到完全相同的结果。也许有更好的方法来进行这种类型的更新?
答案 0 :(得分:1)
你的问题是字符串9和9.0000不相等。他们不加入。这些表变量将用于演示:
DECLARE @TableA TABLE
(
CatScore Int
)
;
DECLARE @TableB TABLE
(
CatScore VARCHAR(10)
)
;
INSERT INTO @TableA (CatScore) VALUES (9);
INSERT INTO @TableB (CatScore) VALUES ('9.0000');
第一个例子强调了不匹配。
不匹配加入示例
SELECT
*
FROM
@TableA AS a
FULL OUTER JOIN @TableB AS b ON b.CatScore = CAST(a.CatScore AS VARCHAR(50))
返回值
CatScore CatScore
9 NULL
NULL 9.0000
您需要做的是匹配数据类型,然后匹配值。这个例子假设:
匹配示例
SELECT
*
FROM
@TableA AS a
FULL OUTER JOIN @TableB AS b ON b.CatScore = CAST(a.CatScore AS VARCHAR(50)) + '.0000'
<强>返回强>
CatScore CatScore
9 9.0000
这里整数9已经被转换为varchar。然后添加了句号和尾随零。它不是小数位,因为它们不是真正的数字。
这项练习的教训是:始终使用正确的数据类型。在字符串中存储数字会导致问题进一步发生。
<强>更新强>
将两个字段CAST转换为DECIMAL会更有意义。包含数字数据的整数和varchars都可以转换为小数。在构建用于匹配的字段时,您希望找到将保存来自两个源字段的所有输入的最小data type。