Ответ 1
Вы можете использовать дополнительный запрос...
WHERE t1.field3 = (SELECT MAX(st1.field3) FROM table1 AS st1)
Но я бы действительно переместил это из предложения where и в оператор объединения, как предложение AND для предложения ON.
Я хочу получить максимальное значение для этой записи. Пожалуйста, помогите мне:
SELECT rest.field1
FROM mastertable AS m
INNER JOIN (
SELECT t1.field1 field1,
t2.field2
FROM table1 AS T1
INNER JOIN table2 AS t2 ON t2.field = t1.field
WHERE t1.field3=MAX(t1.field3)
-- ^^^^^^^^^^^^^^ Help me here.
) AS rest ON rest.field1 = m.field
Вы можете использовать дополнительный запрос...
WHERE t1.field3 = (SELECT MAX(st1.field3) FROM table1 AS st1)
Но я бы действительно переместил это из предложения where и в оператор объединения, как предложение AND для предложения ON.
Как вы заметили, предложение WHERE
не позволяет вам использовать в нем агрегаты. Это предложение HAVING
для.
HAVING t1.field3=MAX(t1.field3)
Правильный способ использования max в условии наличия состоит в том, чтобы сначала выполнить самоподключение:
select t1.a, t1.b, t1.c
from table1 t1
join table1 t1_max
on t1.id = t1_max.id
group by t1.a, t1.b, t1.c
having t1.date = max(t1_max.date)
Ниже приводится описание того, как вы присоединяетесь к подзапросу:
select t1.a, t1.b, t1.c
from table1 t1
where t1.date = (select max(t1_max.date)
from table1 t1_max
where t1.id = t1_max.id)
Обязательно создайте один набор данных перед использованием агрегата при соединении с несколькими таблицами:
select t1.id, t1.date, t1.a, t1.b, t1.c
into #dataset
from table1 t1
join table2 t2
on t1.id = t2.id
join table2 t3
on t1.id = t3.id
select a, b, c
from #dataset d
join #dataset d_max
on d.id = d_max.id
having d.date = max(d_max.date)
group by a, b, c
Версия вспомогательного запроса:
select t1.id, t1.date, t1.a, t1.b, t1.c
into #dataset
from table1 t1
join table2 t2
on t1.id = t2.id
join table2 t3
on t1.id = t3.id
select a, b, c
from #dataset d
where d.date = (select max(d_max.date)
from #dataset d_max
where d.id = d_max.id)
SELECT rest.field1
FROM mastertable as m
INNER JOIN table1 at t1 on t1.field1 = m.field
INNER JOIN table2 at t2 on t2.field = t1.field
WHERE t1.field3 = (SELECT MAX(field3) FROM table1)
да, вам нужно использовать предложение having после предложения Group by, поскольку там, где нужно просто фильтровать данные по простым параметрам, но группа, за которой следует оператор наличия, - это идея группировать данные и фильтровать их на основе некоторой совокупной функции......
Но он все еще выдаёт сообщение об ошибке в Query Builder. Я использую SqlServerCe 2008.
SELECT Products_Master.ProductName, Order_Products.Quantity, Order_Details.TotalTax, Order_Products.Cost, Order_Details.Discount,
Order_Details.TotalPrice
FROM Order_Products INNER JOIN
Order_Details ON Order_Details.OrderID = Order_Products.OrderID INNER JOIN
Products_Master ON Products_Master.ProductCode = Order_Products.ProductCode
HAVING (Order_Details.OrderID = (SELECT MAX(OrderID) AS Expr1 FROM Order_Details AS mx1))
Я заменил ГДЕ ИХ, как сказал @powerlord. Но все же показывается ошибка.
Ошибка синтаксического анализа запроса. [Номер строки токена = 1, смещение линии токена = 371, токен с ошибкой = SELECT]