Как устранить ошибки многосоставного идентификатора

#sql #sql-server #tsql

Вопрос:

Я не могу разобраться в проблеме со следующим запросом:

 select distinct  
    i.Supplr1, v.Name, s.InvtID, s.CuryCost, s.CurySlsPrice, s.OrdNbr,
    Sum(s.CurySlsPrice - s.CuryCost) AS GrossProfit,
    Sum((s.CurySlsPrice - s.CuryCost)/s.CurySlsPrice) AS GrossPer
from
    SOLine s, Inventory i, Vendor v
Inner Join 
    Inventory on Inventory.InvtID = s.InvtID
Inner join 
    Vendor on Vendor.VendID = Inventory.Supplr1

Union All

select distinct  
    a.InvtID, s.OrdNbr, s.OrdNbr, s.CuryCost, s.CurySlsPrice, s.OrdNbr,    
    s.Status, a.PerPost
from 
    ARTran a, Inventory i, SOLine S 
Inner join 
    Inventory on Inventory.InvtId = ARTran.InvtID
Inner join 
    ARTran on ARTran.OrdNbr = SOLine.OrdNbr
 

Ошибки заключаются в следующем:

Msg 4104, Уровень 16, Состояние 1, Строка 20
Не удалось привязать многосоставный идентификатор «s.InvtID».

Msg 4104, Уровень 16, Состояние 1, Строка 31
Многосоставный идентификатор «ARTran.ИнвтИД» не мог быть связан.

Msg 4104, Уровень 16, Состояние 1, Строка 33
Многосоставный идентификатор «SOLine.OrdNbr» не мог быть связан.

Я перепробовал все, что знаю (мой мозг может быть немного затуманен), но продолжаю получать ошибки.

В чем проблема с моим запросом?

Комментарии:

1. Не могли бы вы, пожалуйста, опубликовать схемы таблиц SOLine и. ARTran

2. ПОЧЕМУ вы используете три таблицы как в списке, разделенном запятыми, в FROM предложении (это не рекомендуется и следует избегать!), так и с соответствующими JOIN утверждениями? Следует использовать правильные буквы JOIN s — и они должны получать псевдонимы таблиц JOIN Inventory i ON i.InvtID = s.InvtID . Если вы очистите свой запрос таким образом, он должен работать нормально

3. Почему вы смешиваете join синтаксис с синтаксисом 30-летней давности? вы повторяете таблицы, и это ваша проблема.

4. является ли этот запрос полным. Я вижу номера строк 31, 33, которых нет в вашем коде

5. Явные СОЕДИНЕНИЯ оцениваются перед разделенными запятыми, неявные. Это означает, что Vendor v Inner Join Inventory в предложении можно ссылаться только на столбцы v и инвентаризации ON .

Ответ №1:

Вы должны очистить свой запрос до чего-то подобного:

  • используйте только правильный JOIN синтаксис — избавьтесь от этого старого, дерьмового «списка таблиц, разделенных запятыми» в FROM предложении!
  • используйте псевдоним таблицы для объединенных таблиц

Попробуйте это:

 SELECT 
    i.Supplr1, v.Name, s.InvtID, s.CuryCost, s.CurySlsPrice, s.OrdNbr,
    SUM(s.CurySlsPrice - s.CuryCost) AS GrossProfit,
    SUM((s.CurySlsPrice - s.CuryCost)/s.CurySlsPrice) AS GrossPer
FROM
    SOLine s
INNER JOIN 
    Inventory i ON i.InvtID = s.InvtID
INNER JOIN 
    Vendor v ON v.VendID = i.Supplr1
GROUP BY
    i.Supplr1, v.Name, s.InvtID, s.CuryCost, s.CurySlsPrice, s.OrdNbr

UNION ALL

SELECT DISTINCT  
    a.InvtID, s.OrdNbr, s.OrdNbr, s.CuryCost, s.CurySlsPrice, s.OrdNbr,    
    s.Status, a.PerPost
FROM 
    SOLine s
INNER JOIN 
    Inventory i ON i.InvtId = a.InvtID
INNER JOIN 
    ARTran a ON a.OrdNbr = s.OrdNbr
 

Комментарии:

1. Если вы собираетесь очистить код, DISTINCT не служит никакой полезной цели в первом запросе, и для суммирования ему требуется предложение GROUP BY.

2. @SMor: спасибо — вы абсолютно правы — я обновил свой ответ и добавил GROUP BY — время, чтобы удалить понижающий голос 🙂

Ответ №2:

Выбранные вами столбцы не существуют. Проверьте схему своей базы данных