[英]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.