需要输入| SQL动态查询

时间:2015-01-29 09:50:56

标签: sql sql-server-2012

需要根据用户输入构建动态查询并从结果集中发送记录计数。

所以有6个表我需要建立一个连接内部肯定和休息表连接将基于用户输入,这应该是性能导向。

这是要求

select count(A.A1) from table A

INNER JOIN table B on B.B1=A.A1 
INNER JOIN table B on C.C1=B.B1 
INNER JOIN table D on D.D1=C.C1 
INNER JOIN table E on E.E1=D.D1 
INNER JOIN table F on F.F1=E.E1 

现在,如果用户在UI中选择一些值,则必须执行查询

select count(A.A1) from table A

INNER JOIN table B on B.B1=A.A1 
INNER JOIN table B on C.C1=B.B1 
INNER JOIN table D on D.D1=C.C1 
INNER JOIN table E on E.E1=D.D1 
INNER JOIN table F on F.F1=E.E1 
INNER JOIN table B on G.G1=F.F1 

Where G.Name like '%Germany%'

用户可以发送1-5个选项,并且必须构建查询并相应地发送结果集

因此,如果我首先添加所有连接,然后根据选择添加where子句,那么查询将很容易并且达到目的,但如果用户没有选择任何查询,那么我正在为用户选择创建不必要的连接。

因此,更好的方法是提前编写所有连接,然后使用动态查询过滤或按需加入和使用过滤器。

如果有人可以提供有价值的投入,那就太棒了。

1 个答案:

答案 0 :(得分:0)

当SQL Server执行查询时,第一步是规划查询,即决定获取查询结果的策略。

如果您使用"内部联接"你必须包括所有表格,因为内部加入"表示连接的两个表上必须有匹配的行,因此查询规划器不能任何表格。

但是,如果通过左外连接更改内连接,则连接两侧都没有匹配的行,因此查询规划器可以决定它是否包含在对。因此,如果使用左外连接,并且不对连接右侧的字段进行选择,过滤或执行任何操作,则查询计划程序可以在执行查询时丢弃。这是解决问题的最简单方法。

另一方面,如果要控制要包含或不包含的表,并为每种情况创建自定义查询,可以使用以下几种技术:

  • 制作一个包含表关系定义的图表,并使用一些允许您从图表中获取必要表格的graph manipulation library。我做了这个,但是如果你不这样做很难实现# 39;有经验。
  • 使用Entity Framework。您必须构建一个包含所有表的简单模型。然后,要运行每个查询,您可以在LINQ中以编程方式构建查询,EF将为您生成并执行SQL查询。