基于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 的相关文章

  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 在 postgres 查询中使用列表

    我有一个动态列表 list a b c d 所以长度可能会改变 我想在查询中比较这些列表值 select from student where name in all the list values 我想将列表值传递到此查询中 我怎样才能做
  • SQL不允许表中有重复记录

    如何使其不添加重复项 我想让它通过 ID 之外的所有其他列进行检查 我希望这个无效 ID col1 col2 col3 1 first middle last ID col1 col2 col3 2 first middle last 我希
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 重载<<的返回值

    include
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 当重定向未知时为 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