Pregunta

Tengo 2 tablas

requests (ID, company_id, amount)

companies (ID, name)

con FK restricción (requests.company_id -> companies.id)

requests.company puede NULL

Tengo que conseguir todas las solicitudes y reemplazar company_id con name empresa apropiado o dejado en blanco si no se ha especificado empresa.

Tengo la siguiente consulta:

SELECT R.[ID], C.[name] AS [company], R.[amount], ...
FROM [requests] AS R, [companies] AS C, ...
WHERE R.[company_id] = C.[ID]

y está funcionando muy bien hasta un valor NULL en el campo company.

He intentado hacer a continuación:

SELECT R.[ID], C.[name] AS [company], ...
FROM [requests] AS R, ...
LEFT OUTER JOIN [companies] AS C
ON R.[company_id] = S.ID

Pero consiguió

  

El identificador de multi-parte "R.company_id" no podía ser obligado

Y los mismos errores en los campos de la cláusula ON desplazamiento. ¿Qué estoy haciendo mal?

¿Fue útil?

Solución

El ejemplo de código que mostró tenía elipses y creo que es lo que está en las elipses que están causando el problema.

Usted tiene:

SELECT R.[ID], C.[name] AS [company], ...
FROM [requests] AS R, ...
LEFT OUTER JOIN [companies] AS C
ON R.[company_id] = S.ID

Digamos que es 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

En otras palabras, la mezcla de pre-ANSI 92 se unen interior sintaxis con ANSI 92 sintaxis combinación externa. Las pruebas en SQL Server 2005, parece que el alias R para las solicitudes no se ve más allá de la coma que separa R ... a partir de su ejemplo, y [Ejemplo] como X en la mía. El siguiente trabajo sin embargo lo hizo:

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

o

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.

o mi favorito, porque me gusta ANSI 92 unirse a la sintaxis:

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

Otros consejos

Creo que desee:

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: Véanse los comentarios, participar es necesaria la izquierda ...

También me parece que no hay necesidad de unirse a la izquierda, por lo que puede volver a escribir como:

SELECT R.[ID], C.[name] AS [company]
FROM [requests] AS R
    JOIN [companies] AS C
ON R.[company_id] = C.ID

Cambiar el orden de la tabla en coma hace que funcione en SQL Server 2005,2008 y 2012

por ejemplo

Digamos que usted tiene una consulta como por debajo del cual se producirá un error en SQL 2005 y anterior:

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

La consulta en SQL 2005 y sobre si volver a escribir la consulta y cambiar el orden de la tabla en las comas antes de unirse. por ejemplo

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top