【问题标题】:ORDER BY query with WHERE NOT EXISTSORDER BY 查询与 WHERE NOT EXISTS
【发布时间】:2014-06-10 00:56:58
【问题描述】:

伙计们,我正在尝试显示表格中的所有记录,但前 3 条最新记录除外。我试过 WHERE NOT EXISTS 但我似乎无法让它工作。帮助将不胜感激。

EDITED: 查询:

SELECT  [Subject],
        IssueDate,
        (SELECT d.DepartName 
        FROM dbo.Department d 
        WHERE d.DepartmentID = n.DepartmentID) AS 'Department',
        Body, 
        NoticeImage, 
        Icon 
FROM dbo.Notice n 
WHERE NOT EXISTS (  SELECT TOP(3) [Subject],
                        IssueDate,
                        (SELECT d.DepartName 
                        FROM dbo.Department d 
                        WHERE d.DepartmentID = n.DepartmentID) AS 'Department', 
                        Body, 
                        NoticeImage, 
                        Icon 
                    FROM dbo.Notice n 
                    ORDER BY IssueDate DESC)
                    ORDER BY IssueDate DESC 

它确实被执行了,但是即使 db 中有数据,返回的行也是 0。如果这很重要,数据库中没有空值。

【问题讨论】:

  • 首先,ORDER 子句应始终位于 WHERE 子句之后。看看如果你删除 ORDER BY 会发生什么,然后看看如果你把它移到最后一行会发生什么。
  • 抱歉,请参阅我编辑的问题。
  • 好的。你能解释一下你想找到什么吗?比如,“通知,以及他们各自的部门,不包括公司前 3 名的通知”。
  • 是的,我已经在一个页面上显示了最新的 3 个通知(基于 IssueDate),我需要这个存储过程来返回除这 3 个之外的所有通知...

标签: sql sql-server-2008-r2


【解决方案1】:

您的语法错误是 order by 子句必须在 where 子句之后。我也认为你采取了错误的方法。我会尝试这样的事情:

select myfields
from mytables
where SomeIdField not in 
(select top 3 SomeIdField
from mytables
where whatver
order by someField desc)
and other conditions
order by something

您可以填写详细信息。

【讨论】:

  • 谢谢。我使用了你的建议。
【解决方案2】:

看来你只需要跳过前 3 行。

SELECT  [Subject],
        IssueDate,
        (SELECT d.DepartName 
        FROM dbo.Department d 
        WHERE d.DepartmentID = n.DepartmentID) AS 'Department',
        Body, 
        NoticeImage, 
        Icon 
FROM dbo.Notice n 
ORDER BY IssueDate DESC 
OFFSET 3;

使用 JOIN 代替子查询会更有效

SELECT  [Subject],
        n.IssueDate,
        d.DepartName AS 'Department',
        n.Body, 
        n.NoticeImage, 
        n.Icon 
FROM dbo.Notice n INNER JOIN dbo.Department d ON   d.DepartmentID = n.DepartmentID
ORDER BY IssueDate DESC 
OFFSET 3;

编辑:不带 OFFSET 子句的版本的脏把戏

select * from
    (SELECT  [Subject],
        n.IssueDate,
        d.DepartName AS 'Department',
        n.Body, 
        n.NoticeImage, 
        n.Icon,
        ROW_NUMBER() OVER (ORDER BY IssueDate DESC ) AS RowNum 
FROM dbo.Notice n INNER JOIN dbo.Department d ON   d.DepartmentID = n.DepartmentID
) subquery
where RowNum>3 
ORDER BY IssueDate DESC

【讨论】:

  • 'OFFSET' 附近的语法不正确。这是我在尝试执行上述查询时遇到的错误。 RDBMS 是 SQL server 2008 r2。我相信OFFSET是MSSQL2012的一个特性..
  • 嗯,也许语法是OFFSET 3 ROWS
  • OFFSET 在 sql server 2008r2 中无法识别
  • 非常感谢您的帮助,阿门纳迪尔!真的很感激。
猜你喜欢
  • 1970-01-01
  • 2013-07-07
  • 1970-01-01
  • 1970-01-01
  • 2012-04-05
  • 1970-01-01
  • 2017-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多