O identificador de várias partes não poderia ser ligado em SQL Server 2008
-
22-08-2019 - |
Pergunta
Eu tenho 2 tabelas
requests
(ID
, company_id
, amount
)
companies
(ID
, name
)
com FK restrição (requests.company_id
-> companies.id
)
requests.company
pode ser NULL
Eu preciso para obter todos os pedidos e substituir company_id
com name
empresa apropriou ou deixado em branco se nenhuma empresa foi especificado.
Eu tenho seguinte consulta:
SELECT R.[ID], C.[name] AS [company], R.[amount], ...
FROM [requests] AS R, [companies] AS C, ...
WHERE R.[company_id] = C.[ID]
e está funcionando bem até que um NULL no campo company
.
Eu tentei fazer a seguir:
SELECT R.[ID], C.[name] AS [company], ...
FROM [requests] AS R, ...
LEFT OUTER JOIN [companies] AS C
ON R.[company_id] = S.ID
Mas tenho
O identificador de várias partes "R.company_id" não poderia ser vinculado
E os mesmos erros em campos em mudança cláusula ON
. O que estou fazendo de errado?
Solução
O exemplo de código que você mostrou tinha elipses e eu acredito que é o que está nas elipses que estão causando o problema.
Você tem:
SELECT R.[ID], C.[name] AS [company], ...
FROM [requests] AS R, ...
LEFT OUTER JOIN [companies] AS C
ON R.[company_id] = S.ID
Vamos dizer que é algo como:
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
Em outras palavras, a mistura de pré-ANSI 92 interior sintaxe de associação com as normas ANSI 92 junção externa sintaxe. Testes em SQL Server 2005, parece que o alias R para solicitações não é visto após a vírgula que separa R partir ... no seu exemplo, e [exemplo] como X na minha. O trabalho seguinte no entanto fez:
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
ou
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.
ou o meu favorito, porque eu como ANSI 92 se juntar a sintaxe:
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
Outras dicas
Eu acho que você quer:
SELECT R.[ID], ISNULL(C.[name], '') AS [company]
FROM [requests] AS R
LEFT OUTER JOIN [companies] AS C
ON R.[company_id] = C.ID
EDIT: Ver comentários, join é necessária a esquerda ...
Ele também parece-me que não há necessidade para a esquerda participar, então você pode re-escrita como:
SELECT R.[ID], C.[name] AS [company]
FROM [requests] AS R
JOIN [companies] AS C
ON R.[company_id] = C.ID
Como alterar a ordem da tabela em coma faz funcionar no sql server 2005,2008 e 2012
exemplo
Vamos dizer que você tem uma consulta como abaixo, que irá falhar no SQL 2005 e acima:
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
A consulta vai funcionar no SQL 2005 e acima, se você reescrever a consulta e alterar a ordem da tabela nas vírgulas antes da junção. por exemplo
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