SQL 连接限制
SQL limit with joins
我在获取下一个查询的第一行时遇到问题:
Select mar.Title MarketTitle, ololo.NUMBER, ololo.Title from Markets mar
JOIN(
Select emp.Employee_ID, emp.Market_id, ppp.Title, ppp.NUMBER from Employees emp
JOIN(
select pur.Employee_id Empl,Pro.Title Title, COUNT(pur.Product_id) NUMBER from Purchase pur
LEFT JOIN
Payments pay ON pay.Payment_ID = pur.Payment_ID AND pay.Date > DATEADD(month, -1, GETDATE())
RIGHT JOIN Products pro
ON pur.Product_id = pro.Product_ID
GROUP BY Pro.Title, pur.Employee_id) ppp ON ppp.Empl = emp.Employee_id) ololo
ON mar.Market_ID = ololo.Market_id
ORDER BY NUMBER DESC
我尝试了很多插入"limit 1"的组合,但都出错了。有人可以帮忙吗?
LIMIT
不适用于 SQL Server
。
改用TOP 1
:
SELECT TOP 1 mar.Title MarketTitle, ololo.NUMBER, ololo.Title from Markets mar
JOIN(
Select emp.Employee_ID, emp.Market_id, ppp.Title, ppp.NUMBER from Employees emp
JOIN(
select pur.Employee_id Empl,Pro.Title Title, COUNT(pur.Product_id) NUMBER from Purchase pur
LEFT JOIN
Payments pay ON pay.Payment_ID = pur.Payment_ID AND pay.Date > DATEADD(month, -1, GETDATE())
RIGHT JOIN Products pro
ON pur.Product_id = pro.Product_ID
GROUP BY Pro.Title, pur.Employee_id) ppp ON ppp.Empl = emp.Employee_id) ololo
ON mar.Market_ID = ololo.Market_id
ORDER BY NUMBER DESC
或OFFSET-FETCH
与SQL Server 2012+
:
SELECT mar.Title MarketTitle, ololo.NUMBER, ololo.Title from Markets mar
JOIN(
Select emp.Employee_ID, emp.Market_id, ppp.Title, ppp.NUMBER from Employees emp
JOIN(
select pur.Employee_id Empl,Pro.Title Title, COUNT(pur.Product_id) NUMBER from Purchase pur
LEFT JOIN
Payments pay ON pay.Payment_ID = pur.Payment_ID AND pay.Date > DATEADD(month, -1, GETDATE())
RIGHT JOIN Products pro
ON pur.Product_id = pro.Product_ID
GROUP BY Pro.Title, pur.Employee_id) ppp ON ppp.Empl = emp.Employee_id) ololo
ON mar.Market_ID = ololo.Market_id
ORDER BY NUMBER DESC
OFFSET 0 ROWS
FETCH FIRST 1 ROW ONLY
从您的 SQL 中不清楚您要检索的内容。实际上,您会发现单个员工在所有时间内售出的单一产品的数量最多。然后你要返回他的市场和那个产品的名称。您的 pay.Date > dateadd(...) 没有影响,因为它处于 LEFT JOIN 中。由于您没有返回任何员工信息,我认为这不是您想要的...
如果您想要给定市场中数量最多的产品(?),SQL 将是:
select top 1 mar.Title Market,
pro.Title Product,
count(1) NUMBER
from Markets mar
join Employees emp
on mar.Market_Id = emp.Market_id
join Purchase pur
on emp.Employee_id = pur.Employee_id
join Products pro
on pur.Product_id = pro.Product_ID
where pur.Date > DATEADD(month, -1, GETDATE())
group by mar.Title, pro.Title
order by count(1) desc
我在获取下一个查询的第一行时遇到问题:
Select mar.Title MarketTitle, ololo.NUMBER, ololo.Title from Markets mar
JOIN(
Select emp.Employee_ID, emp.Market_id, ppp.Title, ppp.NUMBER from Employees emp
JOIN(
select pur.Employee_id Empl,Pro.Title Title, COUNT(pur.Product_id) NUMBER from Purchase pur
LEFT JOIN
Payments pay ON pay.Payment_ID = pur.Payment_ID AND pay.Date > DATEADD(month, -1, GETDATE())
RIGHT JOIN Products pro
ON pur.Product_id = pro.Product_ID
GROUP BY Pro.Title, pur.Employee_id) ppp ON ppp.Empl = emp.Employee_id) ololo
ON mar.Market_ID = ololo.Market_id
ORDER BY NUMBER DESC
我尝试了很多插入"limit 1"的组合,但都出错了。有人可以帮忙吗?
LIMIT
不适用于 SQL Server
。
改用TOP 1
:
SELECT TOP 1 mar.Title MarketTitle, ololo.NUMBER, ololo.Title from Markets mar
JOIN(
Select emp.Employee_ID, emp.Market_id, ppp.Title, ppp.NUMBER from Employees emp
JOIN(
select pur.Employee_id Empl,Pro.Title Title, COUNT(pur.Product_id) NUMBER from Purchase pur
LEFT JOIN
Payments pay ON pay.Payment_ID = pur.Payment_ID AND pay.Date > DATEADD(month, -1, GETDATE())
RIGHT JOIN Products pro
ON pur.Product_id = pro.Product_ID
GROUP BY Pro.Title, pur.Employee_id) ppp ON ppp.Empl = emp.Employee_id) ololo
ON mar.Market_ID = ololo.Market_id
ORDER BY NUMBER DESC
或OFFSET-FETCH
与SQL Server 2012+
:
SELECT mar.Title MarketTitle, ololo.NUMBER, ololo.Title from Markets mar
JOIN(
Select emp.Employee_ID, emp.Market_id, ppp.Title, ppp.NUMBER from Employees emp
JOIN(
select pur.Employee_id Empl,Pro.Title Title, COUNT(pur.Product_id) NUMBER from Purchase pur
LEFT JOIN
Payments pay ON pay.Payment_ID = pur.Payment_ID AND pay.Date > DATEADD(month, -1, GETDATE())
RIGHT JOIN Products pro
ON pur.Product_id = pro.Product_ID
GROUP BY Pro.Title, pur.Employee_id) ppp ON ppp.Empl = emp.Employee_id) ololo
ON mar.Market_ID = ololo.Market_id
ORDER BY NUMBER DESC
OFFSET 0 ROWS
FETCH FIRST 1 ROW ONLY
从您的 SQL 中不清楚您要检索的内容。实际上,您会发现单个员工在所有时间内售出的单一产品的数量最多。然后你要返回他的市场和那个产品的名称。您的 pay.Date > dateadd(...) 没有影响,因为它处于 LEFT JOIN 中。由于您没有返回任何员工信息,我认为这不是您想要的...
如果您想要给定市场中数量最多的产品(?),SQL 将是:
select top 1 mar.Title Market,
pro.Title Product,
count(1) NUMBER
from Markets mar
join Employees emp
on mar.Market_Id = emp.Market_id
join Purchase pur
on emp.Employee_id = pur.Employee_id
join Products pro
on pur.Product_id = pro.Product_ID
where pur.Date > DATEADD(month, -1, GETDATE())
group by mar.Title, pro.Title
order by count(1) desc