【问题标题】:SQL limit with joins连接的 SQL 限制
【发布时间】:2016-03-02 02:21:56
【问题描述】:

我无法获得下一个查询的第一行:

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”的组合,但都出现错误。有人可以帮忙吗?

【问题讨论】:

  • 您是否尝试将其作为最后一个子句?你确定你使用MySQL
  • @lad2025,对不起,我已经编辑过了。我正在使用 sql server

标签: sql sql-server select join limit


【解决方案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

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-11
      • 1970-01-01
      • 2010-12-02
      • 1970-01-01
      • 2013-11-02
      • 1970-01-01
      • 2021-08-27
      相关资源
      最近更新 更多