完全外连接不匹配

时间:2016-02-10 17:07:28

标签: sql-server join full-outer-join

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%不同,没有任何匹配

这不可能,因为我可以手动搜索两个表中的记录,并在两个表中找到完全相同的结果。也许有更好的方法来进行这种类型的更新?

enter image description here

1 个答案:

答案 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

您需要做的是匹配数据类型,然后匹配值。这个例子假设:

  1. 表A将猫得分存储为整数。
  2. 表B与varchar存储相同。
  3. 表B在完全停止后总是包含4个零。
  4. 匹配示例

    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