使用交叉应用 - 如何连接表以交叉应用连接
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
如何重新加入从 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