【问题标题】:Need Input | SQL Dynamic Query需要输入 | SQL 动态查询
【发布时间】:2015-01-29 18:10:15
【问题描述】:

有一个需求,我需要根据用户输入构建动态查询并发送结果集中的记录数。

因此,我需要确定 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 子句,那么查询将很容易并达到目的,但如果用户没有选择任何查询,那么我正在为用户选择创建不必要的连接。

那么,提前编写所有连接然后过滤它或按需连接和使用动态查询的过滤器会更好。

如果有人能提供有价值的意见,那就太好了。

【问题讨论】:

  • 您试图通过缩进所有段落来使您的消息具有良好的格式。您不知道的是,如果您使用 4 个或更多字符缩进,那么 SO 会将其视为代码,并且您会得到一种糟糕的格式。我已为您重新格式化,但下次考虑。
  • 你把表名弄乱了,没有表C或G。

标签: sql sql-server-2012


【解决方案1】:

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

如果您使用“内连接”,则必须包含所有表,因为“内连接”意味着连接的两个表上必须有匹配的行,因此查询规划器不能丢弃任何表格。

但是,如果您通过左外连接来更改内连接,则连接的两侧不一定要有匹配的行,因此查询规划器可以决定它是否包含右侧的表。因此,如果您使用左外连接,并且您没有选择、过滤或对连接右侧的字段进行任何操作,则查询规划器可以在执行查询时丢弃然后。这是消除疑虑的最简单方法。

另一方面,如果您想控制包含或不包含哪些表,并为每种情况创建自定义查询,您可以使用多种技术:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多