Я пытаюсь передать столбец из внешнего запроса, как показано ниже, во внутренний запрос в предложении WHERE, и MySQL это не нравится. Я не знаю, как переписать этот запрос, чтобы он заработал.
Я получаю сообщение об ошибке Неизвестный столбец "y.DateShipped" в предложении where
Я пытаюсь присоединиться к строке во внутренней таблице с EffectiveDate, который меньше DateShipped, а также является max EffectiveDate во внутреннем соединении (может быть несколько строк для одной и той же группы с разными EffectiveDate ( s))
Я хотел бы знать, как заставить это работать или переписать его, чтобы он работал. Я использую MySQL 5.6, поэтому у меня нет доступных оконных функций, иначе я думаю, что это могло бы сработать.
select
x.id,
y.id,
y.DateShipped
from Shipment y inner join
(select id, SourceId, DestinationId, SourcePPFContractId, EffectiveDate
from Relationship where EffectiveDate <= y.DateShipped order by
EffectiveDate desc limit 1) x
on x.DestinationId = y.DestinationCustomerId
and x.SourceId = y.OriginCustomerId
and x.SourcePPFContractId = y.OriginContractId;
вам нужно будет указать таблицу отгрузки в подзапросе, чтобы иметь возможность вызвать ее правильно, попробуйте:
select
x.id,
y.id,
y.DateShipped
from Shipment y inner join
(select id, SourceId, DestinationId, SourcePPFContractId, EffectiveDate
from Relationship, Shipment where EffectiveDate <= Shipment.DateShipped order by
EffectiveDate desc limit 1) x
on x.DestinationId = y.DestinationCustomerId
and x.SourceId = y.OriginCustomerId
and x.SourcePPFContractId = y.OriginContractId;
Вы пытаетесь выполнить так называемое боковое соединение, а MySQL не поддерживает их. Поскольку вам нужен только один столбец, вы можете использовать коррелированный подзапрос:
select (select r.id
from Relationship r
where r.DestinationId = s.DestinationCustomerId and
r.SourceId = s.OriginCustomerId and
r.SourcePPFContractId = s.OriginContractId and
r.EffectiveDate <= s.DateShipped
order by r.EffectiveDate desc
limit 1
) as x_id,
s.id, s.DateShipped
from Shipment s ;
Обратите внимание, что я также изменил псевдонимы таблиц, чтобы они были сокращениями для имен таблиц, чтобы запрос было легче читать.
Сначала выполняется внутренний выбор (из отношения), а затем он объединяется с первым выбором. Вот почему это не работает. Вы должны переместить DateShipped в предложение where первого выбора:
select
x.id,
y.id,
y.DateShipped
from Shipment y inner join
(select id, SourceId, DestinationId, SourcePPFContractId, EffectiveDate
from Relationship order by
EffectiveDate desc limit 1) x
on x.DestinationId = y.DestinationCustomerId
and x.SourceId = y.OriginCustomerId
and x.SourcePPFContractId = y.OriginContractId
and x.EffectiveDate <= y.DateShipped;