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?

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top