【问题标题】:Return limited records from SQL View从 SQL 视图返回有限的记录
【发布时间】:2020-01-01 04:43:17
【问题描述】:

我有一个简单的 SQL 视图,其中有一个 SELECT 语句从表中返回多个字段。名为 vw_UserData 的视图看起来像这样:

SELECT client.Lastname, client.Firstname, client.ClientID, client_image.Image 
FROM client
LEFT OUTER JOIN client_image ON client.ClientID = client_image.ClientID
WHERE client_image.Description LIKE '%PHOTO%

image字段为(image/blob)字段,视图返回的记录越多,运行时间越长。

如果我通过添加 TOP 100 并在 WHERE 子句中指定姓氏来运行此查询

SELECT TOP 100 client.Lastname
...
WHERE client_image.Description LIKE '%PHOTO%
AND client.lastname = 'smith'

它将返回所有姓氏为 smith 的记录(计数 = 64 条记录)。

但是,当使用视图(使用 TOP 100)运行 SELECT 并从 WHERE 中删除姓氏时

SELECT * FROM vw_UserData WHERE Lastname = 'smith' 

我只拿回一张唱片!为什么?此外,如果我有一个 Todd Smith 并运行

SELECT * FROM vw_UserData WHERE Lastname = 'smith' and Firstname = 'todd'

我没有返回任何记录。我似乎无法运行包含 TOP 100 的视图并使用该视图运行 SELECT。如果没有指定应用程序使用视图的 WHERE 条件,我希望能够限制返回的记录数 - 即我不想返回所有记录,但要限制它们。但是,如果指定了条件,例如姓氏或名字,我想带回所有这些记录 - 最多 100 条,通常不会超过我们当前数据的记录。

我使用的是 SQL Server 2008 R2。

【问题讨论】:

  • 如果我理解正确,您是否已将TOP 100 放入视图中?好吧,视图将随机选择 100 条记录,其中 Description LIKE '%PHOTO% 可能包含也可能不包含姓氏“smith” - 因此它不会返回预期结果。
  • 使用存储过程和名称搜索/过滤器的几个参数可能会更好
  • 也许您最好将 blob 留在后面并创建另一个视图,您可以 join 根据需要检索 blob,例如ClientSummaries 包含除 ImageClientImages 之外的所有列,仅包含 ClientIdImage
  • 我觉得你的问题很混乱。你能创建一个minimal reproducible example 来重现问题吗?
  • 请注意:SQL Server 2008 和 2008 R2 目前不再提供扩展支持 - red-gate.com/simple-talk/sql/database-administration/… - 是时候升级了!

标签: sql sql-server tsql sql-server-2008-r2


【解决方案1】:

谢谢大家。我们将在下周左右升级到 SQL Server 2017。我会等到那时并使用应该达到我需要的结果的 OFFSET FETCH 子句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多