Ссылаясь на столбец из другой таблицы во внутреннем соединении выберите

Я пытаюсь присоединиться к внутреннему запросу, результаты которого фильтруются по значению в другой таблице, поэтому я могу выбрать верхний результат и использовать значение в нем несколько раз в своем главном операторе выбора, но я получаю ошибка, как показано ниже:

Не удалось связать идентификатор из нескольких частей "TessSCCall.Call_Num".

Смотрите код ниже:

SELECT BestAppointmentOffer AS foo -- I'm using this lots of times in different fields
        BestAppointmentOffer AS bar -- I'm using this lots of times in different fields
    ....
FROM TessSCEmploy 
INNER JOIN TessSCCall on TessSCEmploy.Employ_Num = TessSCCall.Call_Employ_Num
INNER JOIN
(
   SELECT TOP 1 dbo.Aqua_Midnight(AppointmentStartTime) 
     AS BestAppointmentOffer,    CallNumber
   FROM AQWEB.[360Tracking].dbo.AppointmentOffers
   WHERE CallNumber = TessSCCall.Call_Num
   ORDER BY AppointmentStartTime) AS Appointment 
 on TessSCCall.Call_Num = Appointment.CallNumber
where ....

Как я могу заставить это работать, чтобы я мог использовать значение из моего запроса (который я сейчас пытаюсь объединить) в вычислениях в нескольких полях, не повторяя его?

2 ответа

Решение

Самый простой способ сделать это - использовать CROSS APPLY но так как вы используете SQL Server 2000, у вас нет этой опции. Вы должны иметь возможность использовать статистическую функцию, чтобы получить лучший результат для каждого времени встречи:

select BestAppointmentOffer AS foo -- I'm using this lots of times in different fields
        BestAppointmentOffer AS bar -- I'm using this lots of times in different fields
    ....
from TessSCEmploy 
inner join TessSCCall 
  on TessSCEmploy.Employ_Num = TessSCCall.Call_Employ_Num
INNER JOIN 
(
  SELECT min(dbo.Aqua_Midnight(AppointmentStartTime)) AS BestAppointmentOffer, 
    CallNumber
  FROM AQWEB.[360Tracking].dbo.AppointmentOffers
  GROUP BY CallNumber
) AS Appointment 
  on TessSCCall.Call_Num = Appointment.CallNumber
where ....

Вам нужно CROSS APPLY для сопоставления столбцов в производной таблице

...

TessSCEmploy inner join TessSCCall on TessSCEmploy.Employ_Num = TessSCCall.Call_Employ_Num

CROSS APPLY
(SELECT TOP 1 dbo.Aqua_Midnight(AppointmentStartTime) AS BestAppointmentOffer, CallNumber
 FROM AQWEB.[360Tracking].dbo.AppointmentOffers
 WHERE CallNumber = TessSCCall.Call_Num
 ORDER BY AppointmentStartTime) AS Appointment on TessSCCall.Call_Num = Appointment.CallNumber

where ....

CROSS APPLY в любом случае является правильной конструкцией для того, что вы делаете, то есть "ТОП 1 на что-то"

Другие вопросы по тегам