MYSQL: код ошибки: 1054. Неизвестный столбец в предложении where - PullRequest
0 голосов
/ 13 сентября 2018

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

Я получаю сообщение об ошибке: Неизвестный столбец «y.DateShipped» в предложении where

То, что я пытаюсь сделать, - это присоединиться к строке во внутренней таблице с EffectiveDate, который меньше чем DateShipped, а также является максимальным 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; 

Ответы [ 3 ]

0 голосов
/ 13 сентября 2018

Вы пытаетесь сделать так называемое боковое соединение - и 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 ;

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

0 голосов
/ 13 сентября 2018

Внутренний выбор (из Отношения) выполняется первым, а затем объединяется с первым выбором. Вот почему это не работает. Вы должны переместить 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; 
0 голосов
/ 13 сентября 2018

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

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; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...