Ссылаясь на столбец из другой таблицы во внутреннем соединении выберите
Я пытаюсь присоединиться к внутреннему запросу, результаты которого фильтруются по значению в другой таблице, поэтому я могу выбрать верхний результат и использовать значение в нем несколько раз в своем главном операторе выбора, но я получаю ошибка, как показано ниже:
Не удалось связать идентификатор из нескольких частей "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 на что-то"