SQL EXCEPT在Desc顺序中排名前10位

时间:2010-09-15 15:32:21

标签: sql select

我想在我的语句中提取除了TOP 10 以外的所有记录,但是在我的子查询中使用ORDER BY“关键字ORDER附近的语法不正确”时,我一直遇到问题

@ID INT
as
SELECT ComVID, VID, MID, Ucomment, UdateAdded, MemberId, UserName, Avatar

FROM table.miComments JOIN table.mbrProfile2 ON MID = MemberId 

WHERE VID = @ID EXCEPT (SELECT ComVID, VID, MID, Ucomment, UdateAdded, MemberId, UserName, Avatar FROM table.miComments JOIN table.mbrProfile2 ON MID = MemberId 
WHERE VID = @ID ORDER BY UdateAdded DESC) 'ERROR: Incorrect Syntax near the keyword ORDER'

ORDER BY UdateAdded DESC

4 个答案:

答案 0 :(得分:1)

你在谈论偏移。如果您有一个返回行1,2,3,4,5,6,7的查询,并且想要跳过前三个(产生4,5,6,7),则可以指定偏移量为3。

在MySQL中,您可以使用接受偏移参数的LIMIT子句。在PostgreSQL中,你需要OFFSET子句。 SQLServer(截至上次我被迫使用它时)不支持偏移量。

PostgreSQL

  

OFFSET表示在开始返回行之前跳过那么多行。 OFFSET 0与省略OFFSET子句相同。如果同时出现OFFSET和LIMIT,则在开始计算返回的LIMIT行之前会跳过OFFSET行。

SELECT * FROM tbl OFFSET 10

MySQL

在MySQL中,如果没有为某些奇怪的原因指定限制,则无法指定偏移量:

  

要从特定偏移量检索所有行直到结果集的末尾,可以使用一些大数字作为第二个参数。此语句检索从第96行到最后一行的所有行:

SELECT * FROM tbl LIMIT 95,18446744073709551615;

答案 1 :(得分:1)

如果您使用的是MS SQL Server,则没有LIMIT或OFFSET等效项,因此您必须使用子查询来完成您想要的任务。

SELECT ComVID, VID, MID, Ucomment, UdateAdded, MemberId, UserName, Avatar 
FROM table.miComments 
JOIN table.mbrProfile2 ON MID = MemberId  
WHERE VID = @ID AND ComVID NOT IN (
   SELECT TOP 10 ComVID
   FROM table.miComments 
   JOIN table.mbrProfile2 ON MID = MemberId  
   WHERE VID = @ID ORDER BY UdateAdded DESC)  
ORDER BY UdateAdded DESC 

以下StackOverflow链接中包含更多信息,这可能会有所帮助:

LIMIT 10..20 in SQL Server

答案 2 :(得分:0)

此刻我无法重现您的确切SQL配置,但要回答"一般性问题":

  • 选择所有数据
  • 选择TOP 10数据
  • 在两个SELECT查询之间加上EXCEPT

示例:

SELECT
    SUM(s.Records)
FROM
(
    -- List of ALL records
    SELECT
        dbo.people.name,
        dbo.people.address,
        Count (*) as Records
    FROM 
        dbo.people
    WHERE
        dbo.people.registration_date >= '01/01/2013'
        AND
        dbo.people.registration_date < '01/01/2014'
    GROUP BY
        dbo.people.name, dbo.people.address

    -- Exclusion
    EXCEPT

    -- TOP 10 list
    SELECT TOP 10
        dbo.people.name,
        dbo.people.address,
        Count (*) as Records
    FROM 
        dbo.people
    WHERE
        dbo.people.registration_date >= '01/01/2013'
        AND
        dbo.people.registration_date < '01/01/2014'
    GROUP BY
        dbo.people.name, dbo.people.address
    ORDER BY
        COUNT (*) DESC
) s

假设我们有一个人员数据库,他们的姓名+地址组合将它们限定为唯一记录(不是在关系级别,而是在业务需求级别)。

自SQL Server 2005以来,

EXCEPT已经可用。

答案 3 :(得分:0)

您可以将其用作简单查询:

with CTP as (select top 10 id_site from sites order by id_site DESC)
select * from sites
where id_site not in (select id_site from CTP)