#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:
Выбранные вами столбцы не существуют. Проверьте схему своей базы данных