首页 > 解决方案 > SQL 内连接:奇怪的结果

问题描述

我的数据如下所示:

Table_A:

Source     tableName     systemid
A           table_1       123abcA2
B           table_1       222DEFD3
C           table_1       369CCCB3


Table_B:

Source     tableName     systemid
Q          table_2       123abc
R          table_2       222DEF
C          table_2       369CCC

我运行了以下查询:

select a.Source, a.tableName, a.systemid as a_systemid, b.systemid as b_systemid
from table_a as a
inner join table_b as b on a.systemid = b.systemid

这是回来的:

Source     tableName     a_systemid     b_systemid
A           table_1       123abcA2       123abc
B           table_1       222DEFD3       222def
C           table_1       369CCCB3       369CCC

我不应该得到任何回报吗?因为没有匹配。

Table A system id = nvarchar data type

Table b systemid = uniqueidentifier data type

标签: sql-servertsqlinner-join

解决方案


隐式转换正在发生,并且本质上会截断导致匹配的字符串数据。您需要将 uniqueidentifier 显式转换为 nvarchar(max)。

请看这个问题和答案。

DECLARE @t1 TABLE([Source] CHAR(1),tableName VARCHAR(10),systemid nvarchar(max))
DECLARE @t2 TABLE([Source] CHAR(1),tableName VARCHAR(10),systemid uniqueidentifier)
INSERT INTO @t1 SELECT 'A','table_1','15b993cc-e8be-405d-bb9f-0c58b66dcdfe_1'
INSERT INTO @t1 SELECT 'B','table_1','4cffe724-3f68-4710-b785-30afde5d52f8_1'
INSERT INTO @t1 SELECT 'C','table_1','7ad22838-ddee-4043-8d1f-6656d2953545_1'
INSERT INTO @t2 SELECT 'Q','table_2','15b993cc-e8be-405d-bb9f-0c58b66dcdfe'
INSERT INTO @t2 SELECT 'R','table_2','4cffe724-3f68-4710-b785-30afde5d52f8'
INSERT INTO @t2 SELECT 'C','table_2','7ad22838-ddee-4043-8d1f-6656d2953545'

select a.Source, a.tableName, a.systemid as a_systemid, b.systemid as b_systemid
from @t1 as a
inner join @t2 as b on a.systemid = CONVERT(NVARCHAR(MAX),b.systemid)

作为一种实践,为了清楚起见,您应该始终明确地转换不匹配的数据类型,并防止奇怪的“发生了什么?!?!” 东西。


推荐阅读