基于C#列表而不是过滤表过滤sql

2023-12-12

假设我有一个包含以下数据的表:

enter image description here

现在我想按主键部门和号码进行过滤。我有一个必须在代码中过滤的部门和号码组合的列表。 在我看来,我会创建一个连接,结果如下:

select * from employee e
inner join dynamicTable dyn on e.Department = dyn.Department 
                           and e.Number = dyn.Number;

dynamicTable is my List在具有要过滤的主键的 C# 代码中,但我不知道如何将此列表传递到数据库级别。

我不想从员工表中加载所有内容,并通过 linq 或其他方式在代码中进行过滤,因为我的数据库中有数百万员工。

我已经考虑过组合 Primary_keys 并创建一个where in (...),但 firebird 限制最多 1500 条记录where in.

使用的数据库是Firebird 2.1版本


就我个人而言,我认为有两个可以采用的技巧。还有一首“来自过去的爆炸”。

路线#1。使用 GTT:全局临时表

GTT 是在 FB 2.1 中引入的(并且您使用它),并且可以是按连接或按事务。您可能需要每笔交易的数据。这种差异与数据(行)有关,模式(结构和索引,元数据)是持久的。看ON COMMIT DELETE ROWSGTT 文档中的选项。

  • https://www.firebirdsql.org/refdocs/langrefupd21-ddl-table.html
  • http://firebirdsql.su/doku.php?id=create_global_temporary_table和 www.translate.ru
  • Firebird 全局临时表(GTT),触摸其他表吗?

等等。

通过这种方式,您打开事务,用列表中的数据填充 GTT(将这 1500 个数据值对从工作站复制到服务器),在该 GTT 上运行 JOINing 查询,然后COMMIT您的交易和表格内容将自动删​​除。

如果您可以在会话中运行许多几乎相似的查询,那么改为使用 GTT 每个连接并根据需要修改数据可能是有意义的,而不是为每个下一个事务中的每个下一个查询重新填充它,但这是一种更复杂的方法。每天尽早清洁COMMIT这是我更喜欢的默认方法,直到争论为什么每个连接在这种特定情况下会更好。只是不要在查询之间将垃圾保留在服务器上。

路线#2。使用字符串搜索 - 反向LIKE匹配。

在其基本形式中,该方法用于搜索一些巨大且任意的整数列表。你的情况有点复杂,你匹配的是成对的数字,而不是单个的数字。

简单的想法就是这样,假设我们要获取 ID 列可以是 1、4、12、24 的行。 直接的方法是对每个值进行 4 次查询,或者进行WHERE ID = 1 or ID = 4 or ...或使用WHERE id IN (1,4,12,24)。在内部,IN会被展开到那个非常= or = or =然后很可能作为四个查询执行。对于长列表来说效率不高。

因此,为了匹配非常长的列表,我们可以形成一个特殊的字符串。并将其作为文本进行匹配。这使得匹配本身的效率大大降低,并且禁止使用任何索引,服务器对整个表运行自然扫描 - 但它会进行一次性扫描。当匹配列表非常大时,一次性全表扫描比数千次按索引获取更有效。 但是 - 仅当列表与表格的比率非常大时,取决于您的具体数据。

我们使文本包含所有目标值,并用 AND 散布在分隔符中:“~1~4~12~24~”。现在我们制作与 ID 列相同的分隔符-数字-分隔符字符串,并查看是否可以找到这样的子字符串。

通常使用LIKE/CONTAINING是将列与数据进行匹配,如下所示:SELECT * from the_table WHERE column_name CONTAINING value_param
我们扭转它,SELECT * from the_table WHERE value_param CONTAINING column_name-based-expression

  SELECT * from the_table WHERE '~1~4~12~24~' CONTAINING '~' || ID || '~' 

这假设 ID 会自动从整数转换为字符串。如果没有,您将必须手动执行此操作:.... CONTAINING '~' || CAST( ID as VARCHAR(100) ) || '~'

您的情况有点复杂,您需要匹配两个数字:部门和编号,因此如果您按照这种方式,则必须使用两个不同的分隔符。就像是

SELECT * FROM employee e WHERE
  '~1@10~1@11~2@20~3@7~3@66~' CONTAINING
  '~' || e.Department || '@' || e.Number || '~'

问题:你说你的目标列表是 1500 个元素。目标线会……很长。 具体多长???

Firebird 中的 VARCHAR 限制为 32KB AFAIR,较长的文本应制作为文本 BLOB,并减少功能。做LIKE在 FB2.1 中对 BLOB 起作用吗?我不记得了,查看发行说明。还要检查您的库是否允许您将参数类型指定为 BLOB 而不是字符串。 现在,您的连接字符集是什么?如果它类似于 Windows-1250 或 Windows-1251 - 那么一个字符就是一个字节,您可以将 32K 字符放入 32KBytes 中。但是,如果您的应用程序设置的 CONNECTION CHARSET 是 UTF-8 - 那么每个字母占用 4 个字节,并且您的最大 VARCHARable 字符串将减少到 8K 个字母。

您可以尝试避免对这个长字符串使用参数,并将目标字符串常量内联到 SQL 语句中。但随后您可能会遇到最大 SQL 语句长度的限制。

也可以看看:MON$CHARACTER_SET_ID in c:\Program Files\Firebird\Firebird_2_1\doc\README.monitoring_tables.txt然后 FB 文档中的 SYSTEM TABLES 部分介绍了如何将 ID 映射到字符集文本名称。

Route #3穷人的 GTT。输入伪表。

在引入 GTT 之前,有时可以在较旧的 IB/FB 版本中使用此技巧。

优点:您不需要更改持久模式。
缺点:在不更改 SCHEME 的情况下 - 您无法创建索引,也无法使用索引连接。同样,您可以达到单个 SQL 语句的长度限制。

真的,不认为这适用于您的情况,只是为了使答案完整,我认为也应该提到这个技巧。

select * from employee e, (
  SELECT 1 as Department, 10 as Number FROM RDB$DATABASE
  UNION ALL SELECT 1, 11 FROM RDB$DATABASE
  UNION ALL SELECT 2, 20 FROM RDB$DATABASE
  UNION ALL SELECT 3, 7 FROM RDB$DATABASE
  UNION ALL SELECT 3, 66 FROM RDB$DATABASE
) t, 
where e.Department = t.Department 
  and e.Number = t.Number

粗糙且丑陋,但有时这个伪表可能会有所帮助。什么时候?主要是它有助于批量 INSERT-from-SELECT,其中不需要索引:-D 它很少适用于 SELECT - 但只需知道技巧即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于C#列表而不是过滤表过滤sql 的相关文章

  • 从值获取键 - Dictionary>

    我无法通过指定值来获取密钥 我实现这一目标的最佳方法是什么 var st1 new List
  • 使用 C# 使用证书进行 SSL 客户端身份验证

    我需要创建一个 C 应用程序 该应用程序必须使用 SSL 向服务器发送 API 请求 我需要创建客户端身份验证 我已经拥有服务器 CA 证书 客户端证书 cer 客户端私钥 pem 和密码 我找不到有关如何创建客户端连接的示例 有人可以建议
  • Microsoft.Web.Administration 内存泄漏

    拥有一个 Windows 服务 除其他外 还可以监视 IIS 应用程序池 如果任何池已配置应用程序但未运行 则该池 池 将启动 这已经运行良好一段时间了 最近发现该服务存在内存泄漏 查看内存转储 罪魁祸首是用于检查应用程序池的 Micros
  • 关闭模态后清除模态字段

    我有这个模式
  • 检查文件是真实文件还是符号链接

    有没有办法使用 C 来判断文件是真实文件还是符号链接 我已经挖过了MSDN W32 文档 https learn microsoft com en us windows win32 fileio file management functi
  • 未构建 csproj 时抑制 AfterBuild 目标

    我在 MSBuild 中有一个构建后目标来复制一些构建输出 这是 linkedin 作为对AfterBuild目标 暴露于Microsoft CSharp targets
  • 隐藏树视图列表中的节点。在 C# 中

    我正在使用 VS 2005 C 正在处理一个未完成的 WinForm 我已将 XML 解析为树视图列表 但遇到了一些问题 我想知道是否有一种方法可以隐藏 过滤 删除名称中包含 this text 的某个节点 而不必依赖文本框 这就是我对这个
  • 根据值更改 DataGrid 单元格颜色

    我有一个 WPF 数据网格 我想要根据值使用不同的单元格颜色 我的 xaml 上有以下代码 Style TargetType DataGridCell 但不是只选择一个单元格而是选择所有行 我缺少什么 如果您尝试设置DataGrid Cel
  • 为什么编译器不对同一翻译单元中的 ODR 违规发出警告

    在同一个翻译单元中 ODR 问题很容易诊断 那么为什么编译器不会针对同一翻译单元中的 ODR 违规发出警告呢 例如在下面的代码中https wandbox org permlink I0iyGdyw9ynRgny6 https wandbo
  • GridView必须添加到表单标签中才能渲染

    TextWriter tr new StringWriter HtmlTextWriter writer new HtmlTextWriter tr HtmlForm form new HtmlForm form Controls Add
  • WPF:BinaryFormatter 可以序列化 FlowDocument 实例吗?

    我喜欢使用binaryformatter来序列化流文档 但这是例外 Serializable public class BinFlow public FlowDocument my get set BinFlow myBF new BinF
  • C# 如何在没有 GacUtil 的情况下在 GAC 中注册程序集?

    我需要使用批处理文件在 GAC 中注册程序集 有没有办法找到安装位置GacUtil exe或者有没有办法在没有 GacUtil 的情况下注册程序集 Your bestbet is to use a powershell script tha
  • 大表的最佳主键格式

    我正在开发一个 ASP NET 应用程序 它有一些可能很大的数据表 我想知道定义主键的最佳方法是什么 我知道以前已经有人问过这个问题 但由于这是针对特定情况的 所以我认为这个问题是有效的 我在 SQL Server 2008 数据库上使用实
  • 了解C/C++中函数调用的堆栈框架? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我也是 C C 和汇编语言的新手 这
  • CGAL:如何有效计算多面体的面面积?

    我有一个多面体 其面是三角形 我知道在 CGAL 中 Triangle 3 类提供了 squared area 方法 通过它我们可以计算三角形的面积 有什么方法可以将其应用到多面体方面吗 或者关于如何计算每个面的面积有什么想法吗 这是一个例
  • 什么时候适合在 C++ 中使用 static(在未命名的命名空间上)?

    我一整天都在阅读有关未命名命名空间的文章 大多数文章都解释了何时应该在 static 关键字上使用未命名命名空间 但我仍然有一个大问题什么时候适合使用静态 毕竟它还没有完全弃用 那么带有静态函数的头文件我现在应该将它们放入未命名的命名空间中
  • ASP .NET Core IIS 托管用户身份名称为空且 IsAuthenticated=false

    我在 IIS 上运行 ASP NET Core dll 使用 AspNetCoreModule 使用以前的 ASP NET 我可以通过以下方式获取用户身份名称 HttpContext Current User Identity Name 因
  • 同时运行 x 个网络请求

    我们公司有一个网络服务 我想通过我自己的服务发送 XML 文件 存储在我的驱动器上 HTTPWebRequestC 中的客户端 这已经有效了 Web服务同时支持5个同步请求 一旦服务器上的处理完成 我就会从Web服务获得响应 每个请求的处理
  • 在旧版本的 MySQL (<5.5.0) 中模拟 TO_SECONDS()

    出于性能和简单性的原因 我想以秒的形式获取 MySQL 3 x 服务器中 DATETIME 列的内容 或者实际上任何数字类型 我只是想在使用 UNIX TIMESTAMP 时避免所有明显的时区问题 the我表中的日期确实来自不同的区域设置
  • Microsoft Graph API 调用无限期挂起

    我正在尝试使用 Microsoft Graph 查询 Azure Active Directory 用户信息 我可以很好地进行身份验证 但是当我尝试查询用户信息时client Users我的应用程序无限期挂起 没有超时 没有错误 只是挂起

随机推荐

  • 当重定向未知时为 HttpWebRequest.Credentials 构建 CredentialCache

    我最近问了一个question关于服务器返回重定向时的 NetworkCredential 和 HttpWebRequest Credentials 我确定构建 NetworkCredential 实例的 CredentialCache 适
  • 禁止 ASP.NET Web API 上具有空值的属性

    我创建了一个将由移动应用程序使用的 ASP Net WEB API 项目 我需要响应 json 来省略 null 属性 而不是将它们返回为property null 我怎样才能做到这一点 In the WebApiConfig config
  • 在 haskell-pipes 中分叉流流

    我在使用 haskell pipes 引导流通过管道时遇到问题 基本上 我分析了一堆文件 然后我必须 以人性化的方式将结果打印到终端 将结果编码为 JSON 所选路径取决于命令行选项 在第二种情况下 我必须输出一个左括号 然后每个传入值后跟
  • AngularJS:使用 jQuery 更改时,ng-model 绑定不会更新

    这是我的 HTML
  • 如何在 PlayFramework2 中获取用户的 IP?

    出于安全考虑 有时需要通过IP来屏蔽用户 就我而言 我想在 SQL 数据库中管理 IP 黑名单 我想我可以根据操作组合来处理过滤器部分 但为此我需要用户的 IP 那么 如何获取用户的IP呢 PS 应用程序在 nginx 代理后面运行 如果你
  • 如何在导航栏隐藏时启用滑动手势?

    我已经尝试解决这个问题很长一段时间了 但无法弄清楚 我目前的设置 在每个视图控制器中 我隐藏导航栏 如下所示 self navigationController setNavigationBarHidden true animated tr
  • AngularJS 使用范围变量设置 ng-controller

    我有一个模板 用于模式弹出窗口 根据其功能 应该加载不同的控制器 div 控制器 app controller MainCtrl scope function scope scope notification ctrl logout app
  • 如何在css样式中引用内联svg作为光标?

    如何引用内联 svg 作为光标 在代码附加中 第一个光标声明 cursor pointer 第二个 png 可以正常工作 第三个声明对我不起作用 我做错了什么 只需要一个工作样本 提前致谢
  • Android Google Maps API 标记图标内的字符串

    有没有办法可以将字符串的值放入MarkerGoogle Maps API 2 0 上的图标 喜欢这张图片 以一种简单的方式 有点像这样 map addMarker new MarkerOptions position POSITION ti
  • SpringSource 工具套件缺少 Spring MVC 项目模板

    这不是重复的Spring Tool Suite 缺少 Spring MVC 项目模板 使用 STS 2 9 2 并将 com springsource sts wizard 2 9 2 201205071000 RELEASE 放在我的插件
  • 简单的 C++ 指针转换

    谁可以给我解释一下这个 char a unsigned char b b a error invalid conversion from char to unsigned char b static cast
  • 在android中按月从数据库获取值

    I have a database where I have a table 我想要获取 11 月至 11 月的所有值 我创建了类似的东西 public static List
  • 从 R 中的 HTML 选择/选项标签中抓取值

    我正在尝试 相当不成功 使用 R 从网站 www majidata co ke 抓取一些数据 我已经设法抓取 HTML 并解析它 但现在有点不确定如何提取我实际上的位需要 使用XML库我使用以下代码抓取我的数据 majidata get l
  • R 中情节的图例中有小节吗?

    我生成以下图例 legend bottomleft legend c expression bold Long w 10 2 h 10 5 expression q c 0 00 beta 0 expression q c 0 05 bet
  • 更快地显示 HTML 标题属性

    有没有办法减少HTML标题属性的显示延迟 如果您实现自己的工具提示机制 您可以自由调整显示所需的时间 无法修改本机工具提示
  • 如何查看docker镜像内容

    我做了一个 docker pull 并可以列出已下载的图像 我想看看这张图片的内容 在网上搜索过但没有直接答案 如果映像包含 shell 您可以使用该映像运行交互式 shell 容器并探索该映像所包含的任何内容 如果sh不可用 busybo
  • Common Lisp 中的宏延续——关于 OnLisp 中的实现

    In On Lisp p 267 Paul Graham 提供了连续传递宏的实现 setq cont identity defmacro lambda parms body body lambda cont parms body defma
  • 在框架内调用特定的 id

    我在 mainpage html 中有一个 iframe 标记 该 iframe 会回调 back html 有没有办法只调用 back html 中的特定 ID 以在 iframe 中显示 细节 我在 back html 中有 25x25
  • 如何连接到本地谷歌云数据存储数据库?

    我有 GAE 应用程序 它在 Google Cloud Datastore 中创建一些数据并将一些二进制文件存储到 Google Cloud Storage 让我们调用该应用程序WebApp 现在我有一个不同的应用程序在 Google 计算
  • 基于C#列表而不是过滤表过滤sql

    假设我有一个包含以下数据的表 现在我想按主键部门和号码进行过滤 我有一个必须在代码中过滤的部门和号码组合的列表 在我看来 我会创建一个连接 结果如下 select from employee e inner join dynamicTabl