是否有一个SQL Server等效的Lucene的过滤查询概念?

时间:2014-12-28 20:25:41

标签: sql-server

Lucene有一种"过滤查询的方法,"哪些是预先查询"减少"内容域,然后实际查询仅应用于该预查询的结果。

例如,如果我有一个复杂的查询,但我只想将它应用于今年发布的内容,我可以在我的查询中添加一个过滤查询,基本上将整个内容集缩减到今年发布的内容,然后将我的查询应用于此。因此,整个内容域被削减为一个子集,然后查询

SQL中是否有等价物?有没有办法动态地“切断”"数据库的一部分,基于特定的标准,然后只查询剩余的内容?

我非常确定我可以使用临时表来完成它,如下所示:

SELECT * INTO #Temp FROM content WHERE year_published = 2014
SELECT * FROM #Temp WHERE foo = bar

我确信这会有效,但我不确定它的性能实现,这意味着我无法使用常规SQL - 我必须通过封装临时表逻辑的存储过程运行一切(这意味着实体框架可能已经出局)。 (而且,是的,我也可以使用WHERE子句,但是,再次,这里有很多查询...)

此应用程序中的每个查询都应按权限进行过滤。任何用户只能根据总体的行级权限方案返回数据,并且应该按照该方案过滤他们在数据库上进行的每个查询。

有更优雅的方法吗?

2 个答案:

答案 0 :(得分:0)

我在最近的预算和预测应用程序中解决了这个问题。所有关键表DepartmentUser为系统的每个用户指定了可访问的部门,并且内联表值函数 AccessibleDepartments()返回了系统函数{{的部门ID的集合。 3}}等于UserID。通过在DepartmentID上将所有查询内部连接到此函数,可以获得所需的过滤。

如果您需要单独设置读取和写入权限,可以使用单独的表或向表DepartmentUser添加位域来完成。

人:

  • 将所有基表放在登录用户无法访问的模式中;和
  • 自动创建并行(可访问)架构 执行此内部联接并以其他方式镜像基表 架构通过同名的视图

确保即使 ad-hoc 查询也能正确执行访问权限。所有权链接确保第二个模式中的存储过程正常工作。

答案 1 :(得分:0)

您可以使用子查询(也称为派生表)执行此操作:

SELECT *
FROM
(
    SELECT * 
    FROM content 
    WHERE year_published = 2014 
) filter
WHERE foo = bar

也可以写成公用表表达式(CTE)

WITH filter AS (
    SELECT * 
    FROM content 
    WHERE year_published = 2014 
)
SELECT *
FROM filter
WHERE foo = bar

如果您希望这一点可重复而不必在每个查询中都包含过滤器的文字,则可以使用视图执行此操作:

CREATE VIEW Filter AS 
    SELECT * 
    FROM content 
    WHERE year_published = 2014;  

然后:

SELECT *
FROM Filter
WHERE foo = bar

您还可以设置实体化视图,如果过滤器的数据不经常更改,可以提高性能。

所有这些如何适用于您的权限方案将取决于您的实际权限在数据库中的存储方式,以及您打算如何与其他查询进行网格划分。