SQL Server 2008 - 连接字符串

2024-01-10

我需要获取每个行项目的查询结果,并构建一个以分号分隔的组成该项目的材料列表。

架构构成:

表格: LineItems(唯一项目列表) LineItems_Materials(多对多) 材料(独特材料清单)

行项目: ID|行项目 1|'1A.1'

LineItems_Materials: ID|行项目 ID|材质 ID 1|1|1 2|1|2 3|1|3

材料: 编号|材料 1|混凝土 2|钢 3|污垢

因此,对于行项目 1 (1A.1),我希望它显示混凝土;钢;泥土

我知道我可以编写一个函数来做到这一点。我在函数中使用了 CTE...我也可以使用 while 循环。还有其他方法会更好吗?

这是我所拥有的(脚本将构建对象、加载数据和创建函数):

SCRIPT:
    IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[test].[UFN_LineItem_Materials]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
    DROP FUNCTION [test].[UFN_LineItem_Materials]
    GO
    IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[test].[LineItems]') AND type in (N'U'))
    DROP TABLE [test].[LineItems]
    GO
    IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[test].[Materials]') AND type in (N'U'))
    DROP TABLE [test].[Materials]
    GO
    IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[test].[LineItems_Materials]') AND type in (N'U'))
    DROP TABLE [test].[LineItems_Materials]
    GO
    IF  EXISTS (SELECT * FROM sys.schemas WHERE name = N'test')
    DROP SCHEMA [test]
    GO
    CREATE SCHEMA [test] AUTHORIZATION [dbo]
    GO

    Create Table test.Materials(
    MaterialID  INT IDENTITY(1,1),
    Material varchar(100));

    Insert Into test.Materials
    Values('Concrete');


    Insert Into test.Materials
    Values('Steel');


    Insert Into test.Materials
    Values('Dirt');

    GO
    Create Table test.LineItems_Materials(
    LineItemMaterialID  INT IDENTITY(1,1),
    LineItemID          INT,
    MaterialID          INT)

    GO

    Insert Into test.LineItems_Materials
    Select 1,1
    UNION
    Select 1,2
    UNION
    Select 1,3


    GO


    CREATE TABLE [test].[LineItems](
        [LineItemID] [int] IDENTITY(1,1) NOT NULL,
        [ItemNumber] [varchar](25) NULL
    ) ON [PRIMARY]

    GO

    Insert Into [test].[LineItems]
    Select '1A.1'


    GO
    -------------------------------------------------------------
    --Build Material Strings (;) example: List of Materials
    ------------------------------------------------------------

    CREATE FUNCTION test.UFN_LineItem_Materials(@LineItemID INT)
        RETURNS VARCHAR(100)
    AS

    BEGIN

        DECLARE @Materials Varchar(100) = ''
        ;with CTE
        AS(
        Select lm.LineItemID,m.MaterialID,m.Material
        from test.LineItems_Materials lm
        inner join test.Materials m on lm.MaterialID = m.MaterialID
        Where lm.LineItemID = @LineItemID
        )
        Select @Materials += ';' + c.Material
        from CTE c;

        SET @Materials = substring(@Materials,2,LEN(@Materials)-1);

        RETURN @Materials;

    END
    GO

    Select lm.LineItemID,test.UFN_LineItem_Materials(lm.LineItemID) Materials
    From test.Materials m
    inner join test.LineItems_Materials lm on m.MaterialID = lm.MaterialID
    Where m.Material = 'Concrete'

还有其他想法吗?

始终感谢反馈

--S


如果要跨行连接值,请使用 FOR XML 技巧,例如:

SELECT Name + ',' 
FROM Project
FOR XML PATH('') 

这是一个更完整的示例:

select LineItemID, (
        Select m.Material + ','
        From test.Materials m 
        inner join test.LineItems_Materials lm1 on m.MaterialID = lm1.MaterialID 
        Where m.MaterialID in (select MaterialID from test.LineItems_Materials where LineItemID = lm2.LineItemID)
        FOR XML PATH('')  
    ) as Materials
from test.LineItems_Materials lm2
group by LineItemID
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server 2008 - 连接字符串 的相关文章

随机推荐

  • 无法将 Google 日历 api 库导入到 PowerShell

    我正在尝试使用 PowerShell 向 google 日历进行身份验证 为此 我必须安装 Google Apis Calendar v3 为此 我必须安装 nuget 包源 所以我从 nuget 开始 PS C Windows syste
  • 如何使用 JavaFX 格式化 TextField 中的字符串而不更改其值

    我正在尝试改变 a 的值TextField仅供显示 即 当用户尝试输入电话号码时 他们仅输入数字 当他们离开该字段时 它会显示格式化 而不更改该字段中的数据 假设我有一个TextField对于电话号码 它应该只允许数字 最多 10 个字符
  • PostgreSQL 全文搜索:为什么搜索这么慢?

    我有一个小型 PostgreSQL 数据库 3 000 行 我正在尝试在其中一个文本字段 正文 上设置全文搜索 问题是任何查询都非常慢 35 秒以上 我想问题来自于数据库选择顺序扫描模式的事实 这是我的查询 SELECT ts rank c
  • Jqgrid列标题和数据未对齐

    我有一个动态表 是在 C 后面的代码中生成的 我使用 tabletogrid 将此 html 表转换为 Jqgrid 我用来执行此操作的代码是 tableToGrid gvSearchDocuments height auto autowi
  • Laravel - Livewire,如何自定义全局消息URL?

    使用如下例所示的自定义域并不告诉 Livewire 请求以相同的子域为前缀subdomain1在这个例子中 Route domain subdomain1 env APP DOMAIN localhost gt middleware web
  • 在类型化数组中存储符合泛型协议的对象

    我有一个协议 protocol Adjustable Equatable associatedtype T var id String get set var value T get set init id String value T 以
  • 使用mapstruct中的构建器(使用不可变注释处理器)将对象映射到不可变对象

    我们正在使用不可变框架 http immutables github io 生成所有 DTO 现在我们想将这些对象映射到另一个映射结构 http mapstruct org 但生成的 DTO 是不可变的 没有 setter 和构造函数 这与
  • GCC 4.8.1 无法识别的命令行选项“-std=c++11”

    在网上看了很多文献 看来最近的GCC版本肯定支持 std c 11命令行选项 但由于一些疯狂的原因 即使使用 GCC 4 8 1 我也会得到 无法识别的命令行选项 这没有任何意义 C newmingw mingw32 bin gt g v
  • 如何使用 C# 在 firebird 中执行事务(或多个 sql 查询)

    我尝试了多种方法 包括SO 以下 MYSQL 代码在 Firebird 中不起作用 CREATE TABLE publications INT NOT NULL AUTO INCREMENT PRIMARY KEY id filename
  • powershell删除特定注册表项

    我是 PowerShell 新手 我正在尝试从运行注册表项中删除特定值 我正在使用remove item命令 但是 我没有看到用于指定单个值的开关 我不想删除整个键 只想删除一个值 作为参考 我正在尝试执行的批处理等效项 reg delet
  • 可插入注释处理器 API 可以检索源代码注释吗?

    我正在使用 Java6 的可插入注释处理 api 自动创建一些部署 XML 文件 这些 XML 文件的一部分包含对象的描述 描述始终与与类本身关联的 Javadoc 内容相同 我可以强制注释成为 Block 注释的字段 但这会重复信息 在注
  • 如何在基于时间的模拟游戏中防止基于时间的作弊?

    在iPhone游戏 Tiny Tower 中 我猜测它使用了某种基于上次玩游戏和当前时间之间花费的时间的模拟 因为你可以将当前时间向前设置 你将从假中受益经过的时间跨度 有没有一种算法可以用来防止这种事情发生 或者至少让普通用户很难实现 编
  • 如何在 Scala 中使用命名参数创建自定义函数类型?

    假设我想创建一个名为 ImportFunc 的自定义函数类型 它接受一个名为 fileImportID 的 Int 和一个名为 filename 的字符串 我可以使用类型别名很容易地做到这一点 如下所示 type ImportFunc In
  • 错误“元素不能包含空格。内容模型为空。”是什么意思?意思是?

    我正在为一个简单的 xml 组合一个 xml 模式 请参阅下面的 xml 和模式 但我不断收到有关节节点的以下错误 元素不能包含空格 内容模型为空 浏览网络我找不到任何简洁的解释来解释它的含义 所以我可以修复它 有人可以帮忙吗 编辑 感谢大
  • np.where(条件为 None) 不等于 np.where(条件 == None)

    我对 np where 函数感到困扰 在我的示例中为第 7 行 背景 我正在编写 连四子 游戏 这insert chip 方法访问变量self board这是我个人数据类型的 8x8 np 数组Chip 如果没有chip在一个条目中self
  • Angular 2 HTTP GET 返回 URL null

    我正在尝试使用 Angular 2 和 Typescript 发出一个简单的 HTTP GET 请求 我收到 404 错误 网址为空 下面显示的是我的组件文件以及我收到的错误 import Component OnInit from ang
  • 如何访问成员变量sqlite回调

    我需要从 sqlite 回调函数访问类中的变量 它不能是静态的 因为我需要从其他函数访问这个变量 这是我当前的代码 class fromdb private string paramdb char errmsg string param s
  • Chrome 正在由自动化测试软件控制

    我正在 Chrome 中使用 Serenity BDD Selenium 运行自动化测试 我必须下载新的 ChromeDriver 因为我的测试无法运行 gt 测试将打开 ChromeDriver 但无法 以用户身份浏览 当我用谷歌搜索这个
  • 为什么声明转换不会减少 cookie 大小?

    我正在使用 Azure AD net core 2 1 并已注册我的应用程序并将其配置为返回 AD 组作为声明 我还使用声明转换来删除除我的应用程序使用的三个组之外的所有组声明 这成功地消除了 100 多个组 我这样做是希望能够减少后续请求
  • SQL Server 2008 - 连接字符串

    我需要获取每个行项目的查询结果 并构建一个以分号分隔的组成该项目的材料列表 架构构成 表格 LineItems 唯一项目列表 LineItems Materials 多对多 材料 独特材料清单 行项目 ID 行项目 1 1A 1 LineI