gpt4 book ai didi

sql - 将关联表展平为多值列?

转载 作者:行者123 更新时间:2023-12-04 20:35:31 25 4
gpt4 key购买 nike

我有一张只有产品 ID 和类别 ID 的表格(产品可以属于多个类别)。我怎样才能将类别 ID 展平到产品列中,这样我就可以这样结束:

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

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

最佳答案

我创建了一个 CLR aggregate function它采用 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]

关于sql - 将关联表展平为多值列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9779623/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com