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?

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top