Проблема с Inner join в Sql-server 2005 - PullRequest
1 голос
/ 15 июня 2011
   Select FileUpload.FileName AS FINAME, FileUpload.FilePath,MemberPersonalInformation.FirstName As SharedBy  from FileUpload 
   INNER JOIN 
   ContentManagement ON ContentManagement.FileId=FileUpload.FileId  
   INNER JOIN 
   MemberPersonalInformation ON MemberPersonalInformation.MemberId=ContentManagement.CreatedBy 
   INNER JOIN
    SubjectMaster ON ContentToIndividual.SubjectId=SubjectMaster.SubjectId 
    where 
   FileUpload.FileId in
    (Select FileId from ContentManagement where ContentId in
    (Select ContentId from ContentToIndividual where ShowToMemberId=12) 
    AND ContentManagement.ContentTypeId=1 and ContentManagement.SessionId=4)

В то время как я выполняю этот запрос, получая сообщение об ошибке в последнем JOIN, говорящем The multi-part identifier "ContentToIndividual.SubjectId" could not be bound. Но у меня есть SubjectId в обеих таблицах. Я не мог понять, в чем проблема. Пожалуйста, помогите мневне.

Ответы [ 2 ]

4 голосов
/ 15 июня 2011

Вы присоединяете таблицу SubjectMaster к таблице ContentToIndividual, на которую ранее не ссылались.

Вам необходимо присоединиться к contentToIndvidual, прежде чем ссылаться на нее в своем SubjectMaster Присоединении.

например,

 Select FileUpload.FileName AS FINAME, 
        FileUpload.FilePath,MemberPersonalInformation.FirstName As SharedBy  
from FileUpload 
   INNER JOIN 
   ContentManagement ON ContentManagement.FileId=FileUpload.FileId  
   INNER JOIN 
   MemberPersonalInformation ON MemberPersonalInformation.MemberId=ContentManagement.CreatedBy 
    -- You need to add it in here   
    Inner Join ContentToIndividual on SomeColumn = AnotherColumn
   INNER JOIN
    SubjectMaster ON ContentToIndividual.SubjectId=SubjectMaster.SubjectId 
    where 
   FileUpload.FileId in
    (Select FileId from ContentManagement where ContentId in
    (Select ContentId from ContentToIndividual where ShowToMemberId=12) 
    AND ContentManagement.ContentTypeId=1 and ContentManagement.SessionId=4)

Примечание. Даже если вы запрашиваете ContentToIndividual в подзапросе, вы не можете ссылаться на столбцы, если он не является частью основного запроса выбора.

3 голосов
/ 15 июня 2011

Вы не присоединились к ContentToIndividual в своем основном операторе выбора.Вы должны добавить его или не ссылаться на него.

РЕДАКТИРОВАТЬ: просто чтобы добавить, вам на самом деле не нужно добавлять SubjectMaster или ContentToIndividual объединений в основной выбор, так как вы не '• выбирая любые столбцы из любой таблицы - помните, что подзапрос отделен от основного запроса;вы используете его только для получения списка идентификаторов файлов.Также может быть возможно оптимизировать и остальную часть утверждения.

   Select FileUpload.FileName AS FINAME, FileUpload.FilePath,MemberPersonalInformation.FirstName As SharedBy  from FileUpload 
   INNER JOIN 
   ContentManagement ON ContentManagement.FileId=FileUpload.FileId  
   INNER JOIN 
   MemberPersonalInformation ON MemberPersonalInformation.MemberId=ContentManagement.CreatedBy 
   where 
   FileUpload.FileId in
    (Select FileId from ContentManagement where ContentId in
    (Select ContentId from ContentToIndividual where ShowToMemberId=12) 
    AND ContentManagement.ContentTypeId=1 and ContentManagement.SessionId=4)

РЕДАКТИРОВАТЬ 2: Просто для забавы, я думаю, это может немного упростить вещи, поскольку избавится от подзапросов, так что это должно бытьбыстрее ...

SELECT      FileUpload.FileName AS FINAME, FileUpload.FilePath,MemberPersonalInformation.FirstName As SharedBy
FROM        FileUpload 
INNER JOIN  ContentManagement ON ContentManagement.FileId=FileUpload.FileId
            AND ContentManagement.ContentTypeId=1
            AND ContentManagement.SessionId=4
INNER JOIN  ContentToIndividual ON ContentToIndividual.ContentId = ContentManagement.ContentId -- Iguessed at this join
            AND ContentToIndividual.ShowToMemberId=12
INNER JOIN  MemberPersonalInformation ON MemberPersonalInformation.MemberId = ContentManagement.CreatedBy 
...