如何找到一组值的精确匹配?

2024-05-05

我有一个简单的表来存储师生关系,以显示学生正在上谁的课或老师正在教谁。无论哪种方式。 (为便于阅读,按老师排序)

CREATE TABLE TS_RELATIONSHIP
(
    Teacher NVARCHAR(10);
    Student NVARCHAR(10);
)

Example:

Teacher Student
-------------------
Conner     Yumi
Conner     Shawn
Conner     Casey
Ericson    Eric
Ericson    Yumi
Ericson    Sue
Ericson    Lin
Johnson    Shawn
Johnson    Lin
Johnson    Ivan
Johnson    Casey
Johnson    Gina

现在,如果我有一组学生姓名,如何找到数据的“完全匹配”? (顺序无关紧要)

例如,如果学生姓名集是Casey, Gina, Ivan, Lin, Shawn,那么我知道Johnson是我要找的老师,除了这五个人(正是这五个人,没有一个学生少或更多),什么都不会返回(除非其他老师得到了完全匹配)。

我尝试在 C# 的帮助下做到这一点,并做了类似的事情,

string[] studentNames;
DataTable dt = SQL.GetDT(@"SELECT Teacher FROM [TS_RELATIONSHIP] WHERE Student=@p0;",studentNames[0]);    //Assuming SQL.GetDT is a function that execute the T-SQL and return it as a DataTable.
for(int i=1;i<studentNames.Length;i++)
{
    string teacherNames = string.Join(",", dt.AsEnumerable().Select(x => string.Format($"'{x.Field<string>("Teacher")}'")));
    dt=SQL.GetDT(@"SELECT Teacher FROM [TS_RELATIONSHIP] WHERE Student=@p0 and Teacher IN (@p1);",studentNames[i], teacherNames);
}

但很快就会发现这个方法不会返回“精确”匹配!

只要老师“包含”学生列表,它就会作为答案返回(这是不正确的)。

有人能好心教我如何正确地做吗?

无论是使用纯 T-SQL 还是借助 C# 都可以。

非常感谢您的帮助!


这是一个称为关系除法无余数 https://www.red-gate.com/simple-talk/databases/sql-server/t-sql-programming-sql-server/divided-we-stand-the-sql-of-relational-division/.有多种解决方案。这是一个:

首先,您必须将所有值作为表传递给 SQL,为此您需要一个表值参数(如下所示的 C#)。

我假设TS_RELATIONSHIP在两列中是唯一的,并且学生的输入列表也是唯一的

SELECT
  ts.Teacher
FROM TS_RELATIONSHIP ts
LEFT JOIN @students s ON s.Value = ts.Student
GROUP BY
  ts.Teacher
HAVING COUNT(*) = @studentCount
   AND COUNT(s.Value) = @studentCount;

它的作用是从表中取出所有行,将其左连接到输入列表,然后按Teacher并确保总行数等于输入总数,并且匹配输入的数量也恰好等于该总数。

您需要创建一个表类型,我通常有一些标准的单列类型可供使用:

CREATE TYPE dbo.StringList AS TABLE (Value nvarchar(250) NOT NULL PRIMARY KEY);

要作为 TVP 传递完整列表,您可以执行以下操作:

var dtInput = new DataTable();
dtInput.Columns.Add("Value", typeof(string));
foreach (var student in studentNames)
    dtInput.Rows.Add(student);

var dtResult = new DataTable();
using (var conn = new SqlConnection(yourConnString))
using (var comm = new SqlCommand("THE ABOVE QUERY"))
{
    comm.Parameters.Add("@studentCount", SqlDbType.Int).Value = studentNames.Length;
    comm.Parameters.Add(new SqlParameter("@students", SqlDbType.Structured) { TypeName = "dbo.StringList", Direction = ParameterDirection.Input, Value = dtInput});

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

如何找到一组值的精确匹配? 的相关文章

随机推荐

  • 动态添加变量名称值对到 JSON 对象

    我有一个充满 ips 的 json 对象 例如 var ips 然后我将 ip 对象添加到该对象 如下所示 ips ipID 然后我需要向每个 ip 添加动态 变量名称值对 所以我使用这样的代码 var name var value var
  • 下标的使用不明确

    该代码块以前可以工作 但现在不行了 我在纬度和经度变量上收到错误 下标 的使用不明确 这是怎么回事 这是因为 Swift 更新吗 func showPrecincts var urlBoundaries http www oklahomad
  • 从 Storm Bolt 将行插入 HBase

    我希望能够从分布式 非本地 Storm 拓扑将新条目写入 HBase 有一些 GitHub 项目提供以下任一功能 HBase 映射器 https github com ptgoetz storm hbase or 预制风暴螺栓 https
  • 使用 Python 3 从 Twitter API 检索请求令牌

    我正在尝试使用 Python 3 与 Twitter API 交互 以返回页面的链接 该页面为我提供了用于请求访问令牌的 PIN 码 详细信息如下 https dev twitter com docs auth pin based auth
  • postgresql 中带有分组的嵌套聚合函数

    我正在尝试使用嵌套聚合函数和分组来获得总和的平均值 我想做的是 SELECT AVG SUM x GROUP BY y WHERE GROUP BY 也就是说 对于返回的每一行 我希望其中一个字段是总和的平均值 其中每个总和都位于 y 相同
  • 如何将 Properties.Settings.Default 的副本保存到变量?

    我有一个 恢复默认值 选项对话框中的按钮 并且想要恢复仅在此表单中受影响的值 而不是整个 Properties Settings Default 所以我尝试 var backup Properties Settings Default Pr
  • 如何返回空实体的响应状态 405?

    如何在 java REST 中返回带有空实体的响应状态 405 POST Path path public Response createNullEntity return Response created null status 405
  • 如何将标签放在 Flutter DataColumn 小部件中?

    我可以将 DataCell 放在 DataRow 中居中 但是对于 DataColumn 标签如何做到这一点 我希望第一个 DataColumn 左对齐 其余的居中 将标签包裹在 Center 小部件中不会生效 new DataColumn
  • MS-Access:合并彼此“下方”的两个表

    我的 Access 数据库中有两个表 它们看起来像这样 Table1 Kabelnummer Column1 Column2 Column3 1 x x x 2 x x x
  • Python:如何检索每年的谷歌学术引用?

    我正在尝试从 Google Scholar 个人资料中检索信息 我有url from bs4 import SoupStrainer BeautifulSoup from urllib2 import Request urlopen url
  • 我可以在 Android 上使用带有文本视图的列表视图和图像图标吗

    我需要一个像下面的 Android 应用程序那样的列表视图 由于我无法发布图片 所以应该是这样的 图片在这里 一些自由文本 用户名等 这是你的任务 任务1 gt 任务2 gt 任务 1 和任务 2 是将从数据库动态获取的列表 我试图拥有一个
  • 在Java中运行命令行[重复]

    这个问题在这里已经有答案了 有没有办法在 Java 应用程序中运行此命令行 java jar map jar time rel test txt debug 我可以用命令运行它 但我无法在 Java 中运行它 Runtime rt Runt
  • 将大块位图转换为 3 维位图

    Problem 我需要这个大量的数据作为输入 对于基于C的arduino 这是上面示例中所需格式的大量数据 const byte bitmap 8 8 0xFF 0x81 0x81 0x81 0x81 0x81 0x81 0xFF 0x81
  • 如何在点击 Qtablewidget 单元格时获取放置在该单元格中的小部件的行号?

    我正在尝试的是当用户选择项目时获取 QcomboBox 的行号 虽然使用它很容易获得单元格的列和行 cellClicked int int 信号 但仅当单元格上没有小部件时才有效 那么如果单元格中放置了小部件 如何获取行号 Note 所有组
  • SVG 视图框显示屏幕外项目

    我正在使用 HTML5 制作游戏svg标签为图形提供多分辨率显示 游戏的大部分内容已经完成 但在测试中我刚刚遇到了一个主要错误 其中涉及 SVG 对象可见 尽管在非本机分辨率下位于视图框之外 我不确定这是否是我的代码或浏览器本身的缺陷 Go
  • 从 WPF 打印/报告的最佳方法是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在单击片段的按钮时替换该片段?

    我有一个包含多个片段的活动 Activity 最初有片段 其中有两个按钮 单击此按钮后 我必须用新片段替换该片段 每个片段都有各种小部件 并将当前片段替换为各种事件 这是我的问题 我怎样才能实现这个目标 给我建议 您可以用 Fragment
  • 从现有 MongoDB 创建可视化的工具[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我接手了一个现有 MongoDB 的项目 我想获得现有数据的视觉图像 图表等 显然 MongoDB 与
  • Android USB_DEVICE_ATTACHED 持久权限

    如何让 Android 在每次重新连接 USB 设备时都不再请求权限 我想让它记住 USB 设备的 默认使用 复选标记 这样我就不必每次都向同一设备授予权限 我以编程方式检测 USB 设备 Android 手机 何时连接到我的主机设备 An
  • 如何找到一组值的精确匹配?

    我有一个简单的表来存储师生关系 以显示学生正在上谁的课或老师正在教谁 无论哪种方式 为便于阅读 按老师排序 CREATE TABLE TS RELATIONSHIP Teacher NVARCHAR 10 Student NVARCHAR