我现在有一个多标准查询,该过滤器基础上的ID是一个子查询NHibernate的多标准CTE子查询
Subqueries.PropertyIn("Id", detachedCriteria)
子查询中的结果是在多标准查询中使用的所有查询相同。
看起来有点难看的子查询重复的SQL,在我目前的情况下15次。
单独查询的原因是每个人都有不同的连接,并且不希望进行一次大规模的笛卡尔连接。
如果我手写的sql我会退出经重复子查询到一个共同的表表达式
WITH XYZ AS
{
....
}
,然后将子查询是其中id在XYZ在15个查询。
这是一个特定于SQL Server的服务器,替代方案是临时表或其他特定于数据库的功能。
任何想法如何改善查询,或者我坚持与子查询被复制?
感谢您的信息,阅读您的建议后发现此文章确认您的评论。 http://www.singingeels.com/Articles/Understanding_SQL_Complex_Queries.aspx“有一点需要注意的是CTE只能在查询中使用一次,所以你不能在最上面声明你的CTE,然后做多个查询但是,您可以创建多个CTE,然后在一个查询中一起使用它们,并且所有事情都有它的位置,所以如果您发现多次为不同的报告/查询构建相同的CTE,那么您可能需要转向而不是进入VIEW。“ – Ian 2010-11-15 09:08:05
在我的情况下,我无法像创建动态查询那样创建存储过程。为每个动态查询创建一个视图将会变得更慢,吞噬事务日志(可以使用简单的恢复模式放入另一个链接的数据库)。无论如何,CTE不会帮助我。 – Ian 2010-11-15 09:15:11
@Ian:您*可以*使用存储过程。只需传递你在NHibernate查询中使用的所有输入参数即可。如果它有很多参数或事物列表(例如,ID),则可以考虑将参数作为XML传递。 – 2010-11-15 17:49:20