簡體   English   中英

SQL左外連接表

[英]SQL left outer join table

我試圖從兩個表中拉出 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 值列表。

您需要將兩個表 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

SQL Server自動從字符串時,有一個比較轉換 簡單的解決方案是要求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使用的列具有相同的類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM