SQL左外连接表

时间:2018-12-06 11:33:59

标签: sql sql-server left-join

我正试图从两个表中提取3列,但似乎有一个小问题。

SELECT a.[CreatedFromIp], b.[Token],  b.[MaskedP]
from [dbo].[Users] a LEFT OUTER JOIN [dbo].[Cards] b ON a.[Id]= b.[Id]
WHERE CreatedFromIp IS NOT NULL
Order by Token

但是我一直在将数据类型nvarchar转换为bigint时出错。

如果我翻转表,我将获得所有令牌和被屏蔽的信息,但是IP结果只是NULL值的完整列表。

2 个答案:

答案 0 :(得分:0)

您需要将两个表的id列都转换为bigint-由于数据类型不匹配,您会收到错误消息

SELECT a.[CreatedFromIp], b.[Token],  b.[MaskedP]
from [dbo].[Users] a LEFT OUTER JOIN [dbo].[Cards] b 
ON cast(a.[Id] as bigint)= cast(b.[Id] as bigint)
WHERE CreatedFromIp IS NOT NULL
Order by Token

答案 1 :(得分:0)

当进行比较时,

SQL Server会自动从字符串转换 away 。一种简单的解决方案是要求join中可能使用的所有列都属于同一类型。在这种情况下,简单的foreign key定义在建立数据模型时会有所帮助。

您可以通过转换为字符串来消除错误:

SELECT u.[CreatedFromIp], c.[Token], c.[MaskedP]
FROM [dbo].[Users] u LEFT OUTER JOIN
     [dbo].[Cards] c
      ON CONVERT(VARCHAR(255), u.[Id]) = CONVERT(VARCHAR(255), c.[Id])
WHERE CreatedFromIp IS NOT NULL
ORDER BY Token;

当然,这些类型转换之一是多余的,因为该字段已经是字符串。

或者,您可以将列转换为整数-使用try_convert()try_cast()

SELECT u.[CreatedFromIp], c.[Token], c.[MaskedP]
FROM [dbo].[Users] u LEFT OUTER JOIN
     [dbo].[Cards] c
      ON TRY_CONVERT(int, u.[Id]) = TRY_CONVERT(int, c.[Id])
WHERE CreatedFromIp IS NOT NULL
ORDER BY Token;

当然,真正的解决方案是修复数据模型,以使JOIN中使用的列具有相同的类型。