将关联表展平为多值列?

2023-12-07

我有一张表,其中仅包含产品 ID 和类别 ID(产品可以属于多个类别)。如何将类别 ID 平铺到产品列中,因此我以以下内容结束我们:

id | name | desc | categories
1 | test1 | lorem | 1,3,4,23
2 | test2 | ipsom | 4,6,24

就像我需要循环到类别列的单独表中一样。我该怎么做或者有更好的方法吗?


我创建了一个CLR 聚合函数这需要一个varchar列并返回以逗号分隔的所有值。换句话说,它将多个字符串连接到一个以逗号分隔的列表中。我确信它的性能比任何 T-Sql 技巧都要好.

与任何聚合函数一样,它可以与group by。例如:

SELECT id, name, desc, JoinStrings(CONVERT(VARCHAR(20), category_id))
FROM product p
INNER JOIN category_products c ON p.category_id = c.category_id
GROUP BY id, name, desc

以下是将 CLR 程序集创建到 Sql Server 2008 中的 C# 代码:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;


[Serializable]
[Microsoft.SqlServer.Server.SqlUserDefinedAggregate(Format.UserDefined, IsInvariantToDuplicates=false, IsInvariantToOrder=false, IsInvariantToNulls=true, MaxByteSize=-1)]
public struct JoinStrings : IBinarySerialize
{
    private char[] sb;
    private int pos;
    public void Init()
    {
        sb = new char[512000];
        pos = 0;
    }

    public void Accumulate(SqlString Value)
    {
        if (Value.IsNull) return;
        char[] src = Value.ToString().ToCharArray();
        Array.Copy(src, 0, sb, pos, src.Length);
        pos += src.Length;
        sb[pos] = ',';
        pos++;
    }

    public void Merge(JoinStrings Group)
    {
        Accumulate(Group.Terminate());
    }

    public SqlString Terminate()
    {
        if (pos <= 0) 
            return new SqlString();
        else
            return new SqlString(new String(sb, 0, pos-1));
    }

    public void Read(System.IO.BinaryReader r)
    {
        this.Init();
        pos = r.ReadInt32();
        r.Read(sb, 0, pos);
    }

    public void Write(System.IO.BinaryWriter w)
    {
        w.Write(pos);
        w.Write(sb, 0, pos);
    }
}

以下是创建该函数的代码(尽管从 Visual Studio 部署应该会自动完成):

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

将关联表展平为多值列? 的相关文章

  • 带可选参数的 SQL 更新命令?

    我将大约 500 000 个对象插入数据库 其中许多对象是相同的 在数据库中具有相同的主键表示 但其他字段可能不同 因此我使用方法 更新 如果没有行受影响 插入 问题是 有时一个对象的某些字段设置为 null 从文件中无法读取 并且已经在数
  • 在eclipse java项目中加载dll文件

    我正在尝试添加文件sqljdbc auth dll到项目库 我将包含 dll 的文件夹添加为外部类文件夹 在这里 我基本上尝试使用 Microsoft 提供的 SQL 驱动程序连接到我的 SQL SERVER 2008 数据库 我的代码是
  • 开发和生产 SQL Server 之间使用不同的排序规则会出现哪些问题?

    盘问 无法更新 sys columns 还有其他方法吗 https stackoverflow com questions 4018347 unable to update sys columns any other approach含糊地
  • 在 SQL 中查询行序列

    假设我正在存储events有关联users如下表 其中dt代表事件的时间戳 dt user event 1 1 A 2 1 D 3 1 B 4 1 C 5 1 B 6 2 B 7 2 B 8 2 A 9 2 A 10 2 C 这样我们就可以
  • 查找缺失值

    我有一个表 有 2 个重要的列 DocEntry WebId 样本数据就像 DocEntry WebId 1 S001 2 S002 3 S003 4 S005 现在我们可以注意到 在 WebId 列中 S004 丢失了 我们如何通过查询找
  • PDO 和 Microsoft SQL:必须声明表变量“@P1”

    我正在尝试使用 PDO 中的绑定从 Microsoft SQL 数据库中选择一些条目 我正在使用的代码看起来与我在文档中找到的代码类似 但是 当我运行它时 我收到以下警告 警告 PDOStatement execute pdostateme
  • 如何在 Windows 7 - 64 位中安装 IBM db2 ODBC 驱动程序?

    我需要从本地 SQL Server 2008 R2 连接到远程 DB2 我不想使用链接服务器 因此 我正在搜索下载并尝试安装 IBM DB2 驱动程序 因为主机集成服务器附带的用于 DB2 的 Microsoft ODBC 驱动程序非常昂贵
  • 类型与创建 CLR 存储过程不匹配

    我在程序集中有一个如下所示的方法 namespace MyNameSpace public class MyClass Microsoft SqlServer Server SqlProcedure public static void M
  • 如何使用 pgAdmin 恢复 postgreSQL 转储文件?

    我有一个 dmp 文件 想要从中恢复数据库 使用 pgAdmin 我该怎么做 在 PgAdmin3 内 在您正在使用的服务器中创建一个新数据库 右键单击该数据库并选择 恢复 使用 浏览器 按钮选择 dmp 文件 选择 恢复 开始恢复数据库
  • 在 JSP 中迭代列表对象

    我正在做一个项目来尝试自学 spring 和 struts 我目前卡在 JSP 页面上 我有一个 pojo 类 其中包含带有 getter setter 的变量 eid 和 ename 我还有一个 sql 中的表 其具有相同的值和六个填充行
  • 找出会话的默认 SQL Server 架构

    我需要知道正在执行某些 DDL 的 SQL 脚本中当前的默认架构是什么 我不需要设置架构 但我确实需要将对它的引用 名称或 ID 放入变量中 该脚本可能以 Windows 登录身份运行 因此以下内容还不够 SELECT name defau
  • 使用存储过程访问数据可以提供哪些安全优势?

    我看到一些指南建议您通过存储过程对所有数据访问进行分层来保护数据库 我知道对于 SQL Server 您可以保护表甚至列免受 CRUD 操作的影响 例如 Logged in as sa USE AdventureWorks GRANT SE
  • 删除 Sql 服务器中最后一次出现特殊字符之前的子字符串

    我想删除最后一次出现句点之前的子字符串 查询应该转换r k Lee Brown to Lee Brown 所以 基本上我需要最后一个点之前的子字符串 并将其替换为 尝试这个 SELECT RIGHT str CHARINDEX REVERS
  • SQL Server 中不需要的日期时间舍入

    我遇到了一些看起来很奇怪的事情 SQL Server 似乎正在舍入一些DateTime当我将它们保存到时 值不合适datetime列 我怀疑我错过了一些东西 但我找不到它 我正在使用 NET 4 0 针对 SQL Server 2008 运
  • 如何编辑表以启用级联删除?

    我有一个代表用户的表 当用户被删除时我得到 DELETE 语句与 REFERENCE 约束冲突 显然 CASCADE DELETE在SQL Server中并不像我想象的那么容易 需要将选项添加到表中 问题是 我不知道如何添加CASCADE
  • SQL COUNT(*) 返回错误答案

    以下脚本应返回部门名称以及这些部门中的员工人数 营销 行政和销售部门有 0 名员工 但返回值不是 0 而是 1 我怎样才能纠正它 select Department Departments DepartmentID count as Num
  • 左连接,左表中没有重复行

    请看下面的查询 tbl 目录 Content Id Content Title Content Text 10002 New case Study New case Study 10003 New case Study New case S
  • SQL Server:比较两个表中的列

    我最近完成了从某些应用程序的旧版本到当前版本的迁移 在迁移数据库时遇到了一些问题 我需要一个可以帮助我比较两个表中的列的查询 我的意思不是行中的数据 我需要比较列本身来弄清楚我错过了表结构的哪些变化 看一下红门 SQL 比较 http ww
  • 计算行数并仅获取表中的最后一行

    我有一张桌子叫employeexam其结构和数据是这样的 id course id employee id degree date 1 1 3 8 2013 01 14 2 2 4 15 2013 01 14 3 2 4 17 2013 0
  • 左连接 SQL 求和

    我有两张桌子想要加入 比如说表 a 和表 b 表 b 有许多行指向表 a 表 b 包含价格 实际上是一个购物篮 所以我想要的是表a中的所有记录和表b中的价格之和 我努力了 select a sum b ach sell from booki

随机推荐

  • 使用 JQuery 从数组填充表

    我有一个包含 16 个元素的数组 我想将其填充到一个表格中 我希望它有 2 行 每行 8 个单元格 其中填充有数组 我的问题是 当填充表时 表将所有元素填充到一行中 我对 JQuery 没有太多经验 我想尝试让它发挥作用 任何帮助表示赞赏
  • IIS7上可以在html中包含php吗?

    在 Apache 中似乎可以这样做 在 HTML 中包含 php 脚本 但是我可以让 IIS 7 解析 html 文件为 php 吗 目前我的 html 文件允许包含 asp 如果我可以用 php 文件来做到这一点 那就太好了 我的服务器按
  • 使用自定义 java 运行时映像时发生 javax.net.ssl.SSLHandshakeException 但并非没有

    我有这个类 它只发送一个 http post 请求 import java net import java io public class JarRuntimeTest public void start throws Exception
  • BigDecimal、精度和小数位数

    我在应用程序中使用 BigDecimal 来表示数字 例如使用 JPA 我对 精度 和 规模 这两个术语做了一些研究 但我不明白它们到底是什么 谁能解释一下 BigDecimal 值的 精度 和 小数位数 的含义 Column precis
  • 将单个对象插入 json 文件而不重写整个文件

    我正在研究一种使用 JSON NET 将马对象添加到 JSON 格式的马数据库中的方法 一种选择是将整个文件反序列化为马列表 添加新马 然后序列化该列表并重写整个文件 我在下面的代码中实现了这种方法 adds a horse to the
  • row.names() 和 attribute$row.names 有什么区别?

    row names iris 返回一个字符向量 gt row names head iris 1 1 2 3 4 5 6 and attributes iris row names返回一个整数向量 gt attributes head ir
  • 如何在 protobuf-net 中启用字符串驻留?

    我使用的是 v2 rev 421 当我保存 protobuf net 生成的流并将其放入字符串实用程序时 它发现了许多重复的字符串 我说的是应用程序生成的字符串 它可以被实习 但默认情况下字符串实习似乎没有打开 我如何启用它 Thanks
  • AngularJS:旧 Angular 版本中的 $q.race()

    Angular 1 5 8 实现了 q race 方法 它接受一个 Promise 数组并返回一个 Promise 该 Promise 使用第一个已解析 Promise 的值进行解析 然而我现在坚持使用 Angular 1 4 并且需要某种
  • 计算给定速度的轨道截距。

    背景 尝试编写一款 FTL 旅行不受重力影响并且加速度是即时的游戏 给定行星的开普勒轨道和飞船的当前位置及其最大超光速 FTL 速度 如何计算行星的位置 单位 米 秒 我可以获取给定日期时间的行星位置 但我正在努力弄清楚如何计算行星的位置以
  • 在“公共”文件夹中使用索引进行 URL 重写

    我是开发领域的新人 我拼命地想获得好的网址 我检查了该网站是否有类似问题 但找不到我需要的东西 或者我做得不好 情况如下 我为一个站点设置了一个项目 该站点的 index php 文件位于名为 Public 的文件夹中 更清楚地说 这是我现
  • Java 支持哪个版本的 ZIP(1.6 - 或任何与此相关的版本)

    ZIP 格式有多个版本 http en wikipedia org wiki ZIP 28file format 29 Version history 目前还不清楚 Java 支持哪个版本 在源代码中ZipOutputStream它定义了一
  • Python 使用 re 在字符之间创建空格(方括号中的字符除外)

    我有一个数据框 d1 letters ABCDE NOT FGH CCGF NOT HI MPJ NOT L MNA NOT PLJKAJSHD df1 pd DataFrame d1 df1 letters 0 ABCDE NOT FGH
  • 声明中的数组长度可以是非常量吗?

    我对 C 中的数组声明有点困惑 我知道可以这样做 int a 20 Reserved space for 20 int array int b 32 431 10 42 Length in square brackets is auto c
  • Kivy:错误弱引用对象(在时钟函数中)不再存在

    所以这是我的错误代码 我认为这个错误中有一些困难 我查看了论坛但找不到 而且 我有错误在我的手机上 with kivy 启动器 python 3当我用 buildozer 构建时 但我的电脑上没有 ubuntu 18 0 4 和 Windo
  • 为什么我们不能将字符串值分配给二维字符数组?

    include
  • 将终端选项卡标题设置为 unix 中的提示名称

    可以说 提示如下 run scripts gt 如何设置终端选项卡标题与提示相同 即终端选项卡图块也应该是运行脚本 gt 因此 当提示发生变化时 终端标题应该动态更新 许多终端模拟器都能够理解特殊的转义 033 0 foo 007
  • `import` 和 `#include` 之间的区别? CP20

    我不明白为什么 I saw import std core here I can t import std I can t import std iostream I can include
  • linux C++ 套接字选择循环

    我在使用套接字时遇到了一些问题 当循环时 除了第一个循环之外 我没有接收到数据 每次都会超时 如果我关闭并重新打开每个循环的套接字 尽管我似乎正确获取了数据 有什么想法吗 不关闭循环的示例 int socketHandle socket A
  • 仅计算某一特定时区的时区偏移量

    我正在尝试为一位在德国在线教学的人构建一个应用程序 我想将这个人的日程存储在一系列约会开始时间中 例如 let schedule new Date currentDate T07 00 00Z new Date currentDate T0
  • 将关联表展平为多值列?

    我有一张表 其中仅包含产品 ID 和类别 ID 产品可以属于多个类别 如何将类别 ID 平铺到产品列中 因此我以以下内容结束我们 id name desc categories 1 test1 lorem 1 3 4 23 2 test2