【问题标题】:Using Cross Apply - How to Join Tables to Cross Apply Join使用交叉应用 - 如何连接表以交叉应用连接
【发布时间】:2026-02-01 10:25:01
【问题描述】:

如何重新加入从CROSS APPLY 返回为value 的值?

以下代码将存储为 CSV 的值存储在单个列中,并将其拆分为使用 STRING_SPLIT() 的表返回。我只是想重新加入这些值,因为它们处于“表格形式”中。目前,我只能通过在查询下方使用另一个 CTE 来拆分这些逗号分隔值来做到这一点。我很确定可以只加入表数据而无需另一个 CTE。

下面的代码使用 CTE 生成假数据。非常可重复

WITH fake_data AS
(
    SELECT 1 as pkey, 'Billy' as name, 'FE,BF,AF,JF,AA' AS multi_select
)
, lookupTable AS
(
    SELECT 'Forever'   AS lookupValue, 'FE' AS lookupItem UNION ALL
    SELECT 'BoyFriend' AS lookupValue, 'BF' AS lookupItem UNION ALL
    SELECT 'AsFriend' AS lookupValue, 'AF' AS lookupItem
)

, csvToTable AS
(
SELECT value AS lookupItem
FROM fake_data fd
    CROSS APPLY STRING_SPLIT(fd.multi_select, ',')
    /* How do I make the below Left Join Work? */
    --LEFT JOIN lookupTable lt ON lt.lookupItem = fd.value
)

SELECT *
FROM csvToTable csv
--  LEFT JOIN lookupTable lt ON csv.lookupItem = lt.lookupItem

显示问题的 Gif

【问题讨论】:

    标签: csv split cross-apply ssms-2017


    【解决方案1】:

    我不敢相信,但答案是如此简单,以至于我问它时几乎感到尴尬。基本上我只需要给 STRING_SPLIT() 函数返回的表起别名。我只是没有将函数“考虑”为表,但由于它作为 TABLE 返回,因此我可以将其作为别名,然后使用其中的字段。

    这里的关键是别名:

    CROSS APPLY STRING_SPLIT(fd.multi_select, ',') 给它一个别名csv

    下面的新代码展示了如何做到这一点:

    WITH fake_data AS
    (
        SELECT 1 as pkey, 'Billy' as name, 'FE,BF,AF,JF,AA' AS multi_select
    )
    , lookupTable AS
    (
        SELECT 'Forever'   AS lookupValue, 'FE' AS lookupItem UNION ALL
        SELECT 'BoyFriend' AS lookupValue, 'BF' AS lookupItem UNION ALL
        SELECT 'AsFriend' AS lookupValue, 'AF' AS lookupItem
    )
    
    SELECT fd.pkey, fd.name, value
    FROM fake_data fd
        CROSS APPLY STRING_SPLIT(fd.multi_select, ',') csv
        LEFT JOIN lookupTable lt ON lt.lookupItem = csv.value
    

    【讨论】: