使用交叉应用 - 如何连接表以交叉应用连接

Using Cross Apply - How to Join Tables to Cross Apply Join

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

下面的代码将一个值作为 CSV 存储在单个列中,并使用 STRING_SPLIT() 将其拆分为 table 返回。我只是想重新加入这些值,因为它们在 'Table Form' 中。目前,我只能通过在我的查询下方使用另一个 CTE 来执行此操作,该 CTE 将这些逗号分隔值分开。我很确定可以只加入 table 数据而不需要另一个 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 显示问题

我不敢相信,但答案是如此简单,我问这个问题时几乎感到尴尬。基本上我只需要为 STRING_SPLIT() 函数返回的 table 添加别名。我只是没有 'thinking' 作为 table 函数,但由于它作为 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