sql-server - 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
解决方案
隐式转换正在发生,并且本质上会截断导致匹配的字符串数据。您需要将 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)
作为一种实践,为了清楚起见,您应该始终明确地转换不匹配的数据类型,并防止奇怪的“发生了什么?!?!” 东西。
推荐阅读
- elasticsearch - 对elasticsearch索引采取什么措施会导致旧索引数据不起作用并需要重新索引?
- python - 层 lstm_11 的输入 0 与层不兼容:预期 ndim=3,发现 ndim=4。收到的完整形状:[None, 5000, 1, 6]
- microsoft-graph-api - Outlook 插件:从 Outlook 日历中获取选定的事件 ID
- python - 如何在 python dm-script 中遍历 TagGroups
- java - 将字节转换为字符串的方法
- kotlin - 如何在 kotlin 上使用 vararg 返回结果?
- pine-script - 如何在 pinescript 数组中找到最接近的值?
- java - 为什么即使 MethodHandle 正常,我也会在 invokeExact 上得到 WrongMethodTypeException
- sql - 在 SQL 中生成所有可能的组合?
- c++ - _CrtSetDbgFlag 未按预期工作:返回 NULL