L'identifiant plusieurs parties ne peut pas être lié à SQL Server 2008
-
22-08-2019 - |
Question
J'ai 2 tables
requests
(ID
, company_id
, amount
)
companies
(ID
, name
)
avec FK contrainte (requests.company_id
-> companies.id
)
requests.company
peut être NULL
Je dois obtenir toutes les demandes et de le remplacer par company_id
name
entreprise ou approprié laissée vide si aucune entreprise n'a été spécifié.
J'ai requête suivante:
SELECT R.[ID], C.[name] AS [company], R.[amount], ...
FROM [requests] AS R, [companies] AS C, ...
WHERE R.[company_id] = C.[ID]
et il fonctionne très bien jusqu'à ce qu'un NULL dans le champ company
.
J'ai essayé de le faire suivant:
SELECT R.[ID], C.[name] AS [company], ...
FROM [requests] AS R, ...
LEFT OUTER JOIN [companies] AS C
ON R.[company_id] = S.ID
Mais obtenu
L'identificateur en plusieurs parties « R.company_id » ne peut pas être lié
Et les mêmes erreurs sur les champs de changement de clause ON
. Qu'est-ce que je fais mal?
La solution
L'exemple de code que vous montriez avait des ellipses et je crois qu'il est ce qui est dans les ellipses qui causent le problème.
Vous avez:
SELECT R.[ID], C.[name] AS [company], ...
FROM [requests] AS R, ...
LEFT OUTER JOIN [companies] AS C
ON R.[company_id] = S.ID
Disons que c'est quelque chose comme:
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 d'autres termes, le mélange de pré-ANSI 92 jointure interne syntaxe ANSI 92 syntaxe de jointure externe. Test sur SQL Server 2005, il apparaît que l'alias R pour les demandes ne se voit pas passé la virgule qui sépare R de ... dans votre exemple, et [par exemple] comme X dans le mien. Toutefois fait suite aux travaux:
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 mon préféré, parce que j'aime ANSI 92 syntaxe de jointure:
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
Autres conseils
Je pense que vous voulez:
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: Voir les commentaires, la gauche join est nécessaire ...
Il me semble aussi qu'il n'y a pas besoin de la jointure gauche, de sorte que vous pouvez ré-écrire comme:
SELECT R.[ID], C.[name] AS [company]
FROM [requests] AS R
JOIN [companies] AS C
ON R.[company_id] = C.ID
Modification de l'ordre de table par des virgules rend fonctionner dans sql server 2005,2008 et 2012
par exemple
Disons que vous avez une question comme ci-dessous qui échouera dans SQL 2005 et au-dessus:
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 requête travaillera en sql 2005 et au-dessus si vous réécrivez la requête et modifier l'ordre de la table dans les virgules avant la jointure. par exemple
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