SQL покинул внешнюю таблицу соединений - PullRequest
0 голосов
/ 06 декабря 2018

Я пытаюсь извлечь 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 голосов
/ 06 декабря 2018

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 s, имели одинаковый тип.

0 голосов
/ 06 декабря 2018

Вам необходимо преобразовать оба столбца идентификатора таблицы в 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
...