带有连接

时间:2015-11-27 21:16:29

标签: sql sql-server select join limit

我在获取下一个查询的第一行时遇到问题:

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

我尝试了很多插入“限制1”的组合,但所有这些都会出错。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:3)

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-FETCHSQL 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

答案 1 :(得分:1)

从您的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