Не удалось привязать многосоставный идентификатор к SQL Server 2008
-
22-08-2019 - |
Вопрос
У меня есть 2 таблицы
requests
(ID
, company_id
, amount
)
companies
(ID
, name
)
с ограничением FK (requests.company_id
-> companies.id
)
requests.company
может быть NULL
Мне нужно получить все запросы и заменить company_id
с соответствующей компанией name
или оставьте это поле пустым, если компания не была указана.
У меня есть следующий запрос:
SELECT R.[ID], C.[name] AS [company], R.[amount], ...
FROM [requests] AS R, [companies] AS C, ...
WHERE R.[company_id] = C.[ID]
и это работает нормально до тех пор, пока значение NULL в company
поле.
Я попытался сделать следующее:
SELECT R.[ID], C.[name] AS [company], ...
FROM [requests] AS R, ...
LEFT OUTER JOIN [companies] AS C
ON R.[company_id] = S.ID
Но получил
Не удалось привязать состоящий из нескольких частей идентификатор "R.company_id"
И те же ошибки в полях в ON
перенос предложения.Что я делаю не так?
Решение
В примере кода, который вы показали, были эллипсы, и я считаю, что именно то, что находится в эллипсах, вызывает проблемы.
У вас есть:
SELECT R.[ID], C.[name] AS [company], ...
FROM [requests] AS R, ...
LEFT OUTER JOIN [companies] AS C
ON R.[company_id] = S.ID
Допустим, это что-то вроде:
SELECT R.[ID], C.[name] AS [company], X.Field
FROM [requests] AS R, [eXample] as X
LEFT OUTER JOIN [companies] AS C
ON R.[company_id] = S.ID
WHERE X.[request_id] = R.ID
Другими словами, смешивание синтаксиса внутреннего соединения до ANSI 92 с синтаксисом внешнего соединения ANSI 92.При тестировании на SQL Server 2005 выясняется, что псевдоним R для запросов не просматривается за запятой, отделяющей R от ...в вашем примере и [eXample] как X в моем.Однако следующее сработало:
SELECT R.[ID], C.[name] AS [company], X.Field
FROM [eXample] as X, [requests] AS R
-- Requests and companies on the same side of the comma
LEFT OUTER JOIN [companies] AS C
ON R.[company_id] = S.ID
WHERE X.[request_id] = R.ID
или
SELECT R.[ID], C.[name] AS [company], X.Field
FROM [requests] AS R LEFT OUTER JOIN [companies] AS C
ON R.[company_id] = S.ID, [eXample] as X
WHERE X.[request_id] = R.ID
-- Yuck, I would hate to find this. Not at all sure from reading
-- the code how it would work.
или мой любимый, потому что мне нравится синтаксис соединения ANSI 92:
SELECT R.[ID], C.[name] AS [company], X.Field
FROM [requests] AS R
INNER JOIN [eXample] as X ON X.[request_id] = R.ID
LEFT OUTER JOIN [companies] AS C ON R.[company_id] = S.ID
Другие советы
Я думаю, ты хочешь:
SELECT R.[ID], ISNULL(C.[name], '') AS [company]
FROM [requests] AS R
LEFT OUTER JOIN [companies] AS C
ON R.[company_id] = C.ID
Редактировать:Смотрите комментарии, необходимо левое соединение ...
Мне также кажется, что нет необходимости в левом соединении, так что вы можете переписать как:
SELECT R.[ID], C.[name] AS [company]
FROM [requests] AS R
JOIN [companies] AS C
ON R.[company_id] = C.ID
Изменение порядка следования таблиц через запятую заставляет его работать в sql server 2005,2008 и 2012
например, g
Допустим, у вас есть запрос, подобный приведенному ниже, который завершится ошибкой в sql 2005 и выше:
SELECT t1.*,t2.*, t3.*
FROM table1 AS t1, table2 as t2
LEFT OUTER JOIN table3 AS t3
ON t1.id = t3.id
WHERE t1.id = t2.id
Запрос будет работать в sql 2005 и выше, если вы перепишете запрос и измените порядок таблицы в запятых перед объединением.например, g
SELECT t1.*,t2.*, t3.*
FROM table2 as t2, table1 as t1
LEFT OUTER JOIN table3 AS t3
ON t1.id = t3.id
WHERE t1.id = t2.id