Sql 字符串拆分列并连接到另一个表

Sql 字符串拆分列并连接到另一个表,sql,sql-server,Sql,Sql Server,假设我有两张这样的桌子: SELECT O.[ID] AS OfferID, O.[Name] AS OfferName, CAT.[CategoryName] AS CategoryName, CAT.[CategoryID] AS CategoryID FROM JobOffers AS O LEFT JOIN ( SELECT O.[ID

假设我有两张这样的桌子:

SELECT
    O.[ID]                  AS OfferID,
    O.[Name]                AS OfferName,
    CAT.[CategoryName]      AS CategoryName,
    CAT.[CategoryID]        AS CategoryID
FROM
    JobOffers AS O
LEFT JOIN
(
    SELECT 
        O.[ID]              AS OfferID,
        C.[CategoryID]      AS CategoryID,
        C.[Name]            AS Name
    FROM
        (
            SELECT *
            FROM [dbo].[Split](O.[Categories], ',')
        ) AS CJ
    LEFT JOIN
        [Categories] AS C
        ON C.CategoryID = CJ.items  
) AS CAT ON CAT.OfferID = O.[ID]
工作机会:

+----+------------+------------+
| ID |    Name    | Categories |
+----+------------+------------+
|  1 | Programmer | 1,2        |
|  2 | Analyst    | 3          |
+----+------------+------------+
+----+-----------------+
| ID |      Name       |
+----+-----------------+
|  1 | Programming     |
|  2 | Web Programming |
|  3 | Analysis        |
+----+-----------------+
类别:

+----+------------+------------+
| ID |    Name    | Categories |
+----+------------+------------+
|  1 | Programmer | 1,2        |
|  2 | Analyst    | 3          |
+----+------------+------------+
+----+-----------------+
| ID |      Name       |
+----+-----------------+
|  1 | Programming     |
|  2 | Web Programming |
|  3 | Analysis        |
+----+-----------------+
我们有一个字符串拆分,它接受一个字符串、一个分隔符并返回一个表,我的问题是我真的不确定如何在查询中集成该表以加入工作邀请和类别

我的想法是这样的:

SELECT
    O.[ID]                  AS OfferID,
    O.[Name]                AS OfferName,
    CAT.[CategoryName]      AS CategoryName,
    CAT.[CategoryID]        AS CategoryID
FROM
    JobOffers AS O
LEFT JOIN
(
    SELECT 
        O.[ID]              AS OfferID,
        C.[CategoryID]      AS CategoryID,
        C.[Name]            AS Name
    FROM
        (
            SELECT *
            FROM [dbo].[Split](O.[Categories], ',')
        ) AS CJ
    LEFT JOIN
        [Categories] AS C
        ON C.CategoryID = CJ.items  
) AS CAT ON CAT.OfferID = O.[ID]
目前,我有两个错误:

  • 无法绑定多部分标识符O.[ID]
  • 无法绑定[类别]的多部分标识符
  • 附近的语法不正确
    (最后一行)

显然,问题在于如何构造子查询。

您可以将其简化为类似的内容

SELECT
    O.[ID]                  AS OfferID,
    O.[Name]                AS OfferName,
    c.[CategoryName]      AS CategoryName,
    c.[CategoryID]        AS CategoryID
FROM
    JobOffers AS O
outer apply [dbo].[Split](O.[Categories], ',') s
left join Categories as C on c.CategoryID = s.Items
我关心的是你的分裂。如果存在多个select语句,则性能将受到严重影响。有关各种可用拆分器的详细说明,请访问本文


如果每个类别都有一行,那么这将起作用:

select jo.*, c.name as category
from joboffers jo join
     categories c
     on ',' + jo.categories + ',' like '%,' + cast(c.id) + ',%';
在SQL Server中,将它们重新聚合为字符串是一件痛苦的事情(但很有可能)

注意:您的数据结构非常非常糟糕。因此,您应该按照评论中提到的方式修复它。为什么不好

  • 您正在将数字存储为字符串
  • 您的ID与引用表没有外键关系
  • 在单个字段中存储多个值

在SQL SERVER 2016中,我们可以使用SQL内置函数字符串 详情如下:

SELECT * FROM JobOffers as j 
outer apply STRING_SPLIT(j.[Categories], ',') s
left join dbo.Categories as c on c.CategoryID =s.value

在较大的数据集上使用这样的用户定义函数会导致性能不佳。考虑创建一个新的表JooPoeCype(JooPofID,CyryYID),而不是类别Cyrn.不幸的是,我只限于技术方面,因为数据库是遗留的,他们不打算在任何时候改变它。目前,他们对工作机会和所有类别进行获取,并在C#side进行解析。尝试对事物进行一些优化,并在数据库端包含全文,因此此选择的结果基本上是一个视图。旁注:从SS 2016开始,有一个内置函数,名为can Any help,介绍如何在sql server 2012中实现这一点,因为没有字符串分割函数Good link。另外请注意,从2016年开始,sql server中有一个内置函数名为“我看不到此拆分函数”2012@AmeerPappay该拆分函数是用户定义的函数。你可能想读我最后链接的那篇文章。本机字符串分割函数在sql server 2016或更高版本之前不可用。