Присоединиться к подзапросу не работает? - PullRequest
1 голос
/ 10 октября 2009

Я должен иметь возможность ссылаться на таблицы в предложениях объединения из подзапроса, не так ли?

Но следующий запрос выдаёт мне ошибки о том, что они не могут быть связаны:

select *
from call c
JOIN call_task ct ON c.call_no=ct.call_no AND ct.calltask_no = (select min(ict.calltask_no) FROM call_task ict WHERE ict.call_no=c.call_no)
JOIN business b ON c.service_business_id=b.business_id
JOIN item i ON ct.item_id=i.item_id
JOIN    (   select top 1 * 
            FROM contract_line icl
            WHERE   icl.item_id = i.item_id 
                AND icl.location_no = c.service_location_no 
                AND icl.business_id = b.business_id
            ORDER BY icl.cancel_date asc
        ) cl ON i.item_id=cl.item_id 
             AND cl.location_no=c.service_location_no 
             AND cl.business_id=b.business_id
JOIN [contract] co ON cl.cont_no=co.cont_no
JOIN business_location bl ON bl.business_id=c.service_business_id AND bl.location_no=c.service_location_no
WHERE b.bus_code='INGRAM04'
AND ct.cont_no is null
AND call_sts NOT IN ('BB', 'BI', 'CA', 'CL', 'IP')
--AND cl.end_date > c.entry_date
ORDER BY c.create_time

Ошибки: Сообщение 4104, уровень 16, состояние 1, строка 1 Многоэлементный идентификатор «i.item_id» не может быть связан. Сообщение 4104, уровень 16, состояние 1, строка 1 Многоэлементный идентификатор "c.service_location_no" не может быть связан. Сообщение 4104, уровень 16, состояние 1, строка 1 Не удалось связать идентификатор из нескольких частей "b.business_id".

Я не понимаю, почему я получаю эти ошибки, и не могу придумать, как их обойти. Элемент item_no в контрактной строке может появляться в контракте более одного раза, если он был отменен и, например, была создана новая строка. В этих случаях мне нужно игнорировать отмененную строку и тянуть текущую. Выполнение подзапроса и упорядочение с помощью cancel_date сначала вытягивает пустые значения, так что оно выполняет то, что я хочу ... но эта странная ошибка привязки облажает меня. Я знаю, что использовал эту технику раньше, поэтому теперь я в замешательстве ...

Ответы [ 3 ]

5 голосов
/ 10 октября 2009

Вы не можете использовать зависимые подзапросы в JOIN. Вместо этого используйте APPLY. Используя пример KM:

declare @table table (t int);
select     t1.t     
from @table t1    
cross apply (select t2.t from @table t2 where t1.t=t2.t) as dt
1 голос
/ 10 октября 2009

Я полагаю, что ошибка исходит от выбранного вами псевдонима с cl, который пытается присоединиться к

WHERE   icl.item_id = i.item_id 
AND icl.location_no = c.service_location_no 
AND icl.business_id = b.business_id

Вы не можете ссылаться на "i", "c" и "b" там.

0 голосов
/ 10 октября 2009

это не подзапрос, а производная таблица (или некоторые называют ее встроенным представлением). Вот простой запрос, чтобы показать ту же проблему:

declare @table table (t int)
select 
    t1.t 
    from @table t1
    inner join (select t2.t from @table t2 where t1.t=t2.t) dt on 1=1

Msg 4104, Level 16, State 1, Line 2
The multi-part identifier "t1.t" could not be bound.

все, что находится между ( ), изолировано от внешнего запроса.

это подзапрос, который работает:

select 
    t1.t 
    from @table t1
    WHERE exists (select * from @Table t2 where t1.t=t2.t)

ВЫВОД:

t
-----------

(0 row(s) affected)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...