Mysql: код ошибки: 1054. неизвестный столбец в предложении where

Я пытаюсь передать столбец из внешнего запроса, как показано ниже, во внутренний запрос в предложении 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; 
1
0
1 972
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

вам нужно будет указать таблицу отгрузки в подзапросе, чтобы иметь возможность вызвать ее правильно, попробуйте:

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; 

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