El identificador de varias partes no podía ser obligado en SQL Server 2008
-
22-08-2019 - |
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?
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