Почему я получаю сообщение об ошибке при попытке объединить таблицы в моем запросе SQL Server - PullRequest
0 голосов
/ 05 января 2019

Я написал запрос ниже, чтобы собрать данные о доходах водителя грузовика. И основной запрос, и объединенный запрос работают правильно. Однако, когда я объединяю их, я получаю ошибку

Сообщение 4104, Уровень 16, Состояние 1, Строка 37
Не удалось связать многоэлементный идентификатор "tn.ctripnumber"

относится к tRev.ctripnumber = tn.ctripnumber. Я попытался использовать имя таблицы выручки, а также псевдоним tRev.

select 
    tn.ctripnumber as "Load Number",
    tr.cresourcedesc as "Carrier/Driver",
    tr.resourcetype as "Resource Type",
    tn.cfirmorigin as "Pickup Origin",
    tn.corigaddress as "Origin Address",
    tn.corigcity as "Origin City",
    tn.corigstate as "Origin State",
    tn.corigzip as "Origin Zip",
    tn.dorigappt_start as "Scheduled Arrival Date",
    tn.dorigappt_end as "Scheduled Late Arrival Date",
    tn.dtripstartdate as "Actual Arrival Date",
    datediff(minute,tn.dorigappt_start,tn.dtripstartdate) as "Arrival Diff",
    (case when tn.dtripstartdate-tn.dorigappt_start < 0 then 'Early' when tn.dorigappt_start-tn.dtripstartdate = 0 then 'On-time' else 'Late' end) as Arrival_Rank,
    tn.cfirmdestination as "Delivery Destination",
    tn.cdestaddress as "Destination Address",
    tn.cdestcity as "Destination City",
    tn.cdeststate as "Destination State",
    tn.cdestzip as "Destination Zip",
    tn.ddestappt_start as "Scheduled Delivery Date",
    tn.ddestappt_end as "Scheduled Late Delivery Date",
    tn.ddeliverydate as "Actual Delivery Date",
    datediff(minute,tn.ddestappt_start,tn.ddeliverydate) as "Delivery Diff",
    (case when tn.ddeliverydate-tn.ddestappt_start < 0 then 'Early' when tn.ddeliverydate-tn.ddestappt_start = 0 then 'On-time' else 'Late' end) as "Delivery Rank",
    tn.nideadheadmiles as "Deadhead Miles",
    tn.niloadedmiles as "Loaded Miles",
    tn.nideadheadmiles + tn.niloadedmiles as "Total Miles"
from 
    tripnumber tn,tripresources tr
inner join
    (select  
         r.ctripnumber, sum(Revenue_Subtotal) as "Revenue" 
     from 
         (select 
              r.ctripnumber, r.cmethod, sum(r.curevenue) as Revenue_Subtotal
          from 
              revenuedtl r 
          where 
              r.cmethod in (select distinct r.cmethod from revenuedtl r)
          group by 
              r.ctripnumber, r.cmethod) r
     --where r.cmethod like 'BROK%'
     group by 
         r.ctripnumber) tRev on tRev.ctripnumber = tn.ctripnumber
where 
    tn.ctripnumber = tr.ctripnumber
    --and tn.ctripnumber = '324412'
    and tr.resourcetype in ('D','M')
    and tn.dtripstartdate >= '2018-12-01 00:00:00.000'
    and tn.dtripstartdate < '2019-01-01 00:00:00.000'

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Это комментарий, который не помещается в разделе комментариев. Старайтесь не смешивать старомодные СОЕДИНЕНИЯ с современными объединениями. Это затрудняет чтение и отладку.

Например, измените это:

from tripnumber tn,tripresources tr
where tn.ctripnumber = tr.ctripnumber

К этому:

from tripnumber tn
join tripresources tr on tn.ctripnumber = tr.ctripnumber
0 голосов
/ 05 января 2019

Это ваше from предложение:

from tripnumber tn,
     tripresources tr join
     (select r.ctripnumber, sum(Revenue_Subtotal) as "Revenue" 
      from (select r.ctripnumber, r.cmethod, sum(r.curevenue) as Revenue_Subtotal
            from revenuedtl r 
            where r.cmethod in (select distinct r.cmethod from revenuedtl r)
            group by r.ctripnumber, r.cmethod
           ) r
    --where r.cmethod like 'BROK%'
      group by r.ctripnumber
     ) tRev
     on tRev.ctripnumber = tn.ctripnumber

Простое правило: Никогда не используйте запятые в предложении FROM. Всегда используйте правильный, явный, стандартный JOIN синтаксис.

Итак, перепишите это использование правильного JOIN:

from tripnumber tn join
     tripresources tr
     on tn.ctripnumber = tr.ctripnumber join
     (select r.ctripnumber, sum(Revenue_Subtotal) as "Revenue" 
      from (select r.ctripnumber, r.cmethod, sum(r.curevenue) as Revenue_Subtotal
            from revenuedtl r 
            where r.cmethod in (select distinct r.cmethod from revenuedtl r)
            group by r.ctripnumber, r.cmethod
           ) r
    --where r.cmethod like 'BROK%'
      group by r.ctripnumber
     ) tRev
     on tRev.ctripnumber = tn.ctripnumber

И ваша ошибка исчезнет.

Техническая причина, по которой ваш запрос не выполняется, состоит в том, что правила области видимости для , отличаются от CROSS JOIN. Вы можете заменить запятую на CROSS JOIN, чтобы устранить проблему. Но правильное решение - правильно выразить свои объединения.

...