Sql server 从包含int数组的字段中查找记录的最佳方法是什么?顺便说一下,查询参数也是一个int数组

Sql server 从包含int数组的字段中查找记录的最佳方法是什么?顺便说一下,查询参数也是一个int数组,sql-server,Sql Server,假设我有一个表'T1',其中包含3条记录,如下所示: A B 101,103,115,189 NAME1 101,115 NAME2 102,116 NAME3 现在我必须找到字段A中包含101102115的所有行,这些行应该是NAME1、NAME2和NAME3。 因为有超过100000行,所以我需要找到一种有效的方法来做到这一点 非常感谢您的帮助 我正在使用SQL Server 2014 解决方案: 我创建了第三个表来维护Job和C

假设我有一个表'T1',其中包含3条记录,如下所示:

A               B
101,103,115,189 NAME1
101,115         NAME2
102,116         NAME3
现在我必须找到字段A中包含101102115的所有行,这些行应该是NAME1、NAME2和NAME3。 因为有超过100000行,所以我需要找到一种有效的方法来做到这一点

非常感谢您的帮助

我正在使用SQL Server 2014

解决方案:

我创建了第三个表来维护Job和Category表之间的关系,最后的查询应该是这样的:

A               B
101,103,115,189 NAME1
101,115         NAME2
102,116         NAME3
从作业Id所在的作业中选择* 从作业类别中选择DISTINCTJob_Id,其中类别Id位于100015100054100060100062100063100068100070100072100073100081100096100099中

MS SQL Server 2017架构设置:

问题1:

:


最正确的答案是,首先不要这样存储数据,因为像这样以逗号分隔的值违背了数据库设计的许多核心原则。由于您使用的是SQL Server 2014,因此您需要一个用户定义的TVF,该TVF可以拆分这些值,然后将其与表的其余部分交叉应用。@alroc,谢谢您的建议,我认为您是对的。我正在尝试创建第三个表来维护两个表之间的关系,在我完成后将共享解决方案。@Jack您必须验证符合您需要的答案。我知道,正如我所说,您的答案是有效的。但我认为“alroc”是对的,我不应该这样存储数据。我可能需要创建第三个表来保持与这两个表的关系,我仍在处理它。我想在完成后与大家分享解决方案。这就是为什么我现在不能验证答案。
;WITH tmp(SomeID, B, DataItem, A) AS
(
    SELECT
        SomeID,
        B,
        LEFT(A, CHARINDEX(',', A + ',') - 1),
        STUFF(A, 1, CHARINDEX(',', A + ','), '')
    FROM Testdata
    UNION all

    SELECT
        SomeID,
        B,
        LEFT(A, CHARINDEX(',', A + ',') - 1),
        STUFF(A, 1, CHARINDEX(',', A + ','), '')
    FROM tmp
    WHERE
        A > ''
)



select distinct B from tmp where DataItem IN ('101','102','115')
|     B |
|-------|
| NAME1 |
| NAME2 |
| NAME3 |