Не удалось привязать многосоставный идентификатор к SQL Server 2008

StackOverflow https://stackoverflow.com/questions/1080097

Вопрос

У меня есть 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top