【发布时间】: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包含除Image和ClientImages之外的所有列,仅包含ClientId和Image。 -
我觉得你的问题很混乱。你能创建一个minimal reproducible example 来重现问题吗?
-
请注意:SQL Server 2008 和 2008 R2 目前不再提供扩展支持 - red-gate.com/simple-talk/sql/database-administration/… - 是时候升级了!
标签: sql sql-server tsql sql-server-2008-r2