【问题标题】:Join with comma-separated data returned from function using SQL使用 SQL 与从函数返回的逗号分隔数据连接
【发布时间】:2014-04-08 10:41:35
【问题描述】:

我正在努力解决这个问题,但我无法解决它。我有来自一列的逗号分隔的数据,我用一个函数拆分它,我需要返回所有逗号分隔的值。

我正在做类似外部加入 ApplicationDocument 表

这里是查询:

SELECT PA.Id,
       Ad.Id,
       Ad.DocumentTitle,
       Ad.Path
       ,
       S.value
FROM dbo.ApplicationDocument AS Ad
right JOIN dbo.PostApplication AS PA
ON Ad.ApplicationId = PA.Id
JOIN dbo.Post P
ON PA.JobId = P.Id
outer APPLY dbo.fnSplit(P.RequiredDocuments,',') as S
WHERE S.Value = Ad.DocumentTitle

【问题讨论】:

    标签: sql sql-server sql-server-2008 join


    【解决方案1】:
    CROSS APPlY  (select value 
                 from  dbo.fnSplit(P.RequiredDocuments,',')  
                 WHERE Value =Ad.DocumentTitle) as  S 
    

    【讨论】:

    • 它说:找不到多部分标识符“P.RequiredDocuments”
    • @EhsanSajjad:现在更新。您需要使用Cross APPLY
    • +1 ,几乎解决但需要返回所有逗号分隔值。请检查更新
    • @EhsanSajjad:你不能返回多个,因为你有一个where。所以它会返回仅匹配条件的项目
    【解决方案2】:
    SELECT PA.Id, 
           Ad.Id,
           Ad.DocumentTitle,
           Ad.Path,
       X.Value
    FROM dbo.ApplicationDocument AS Ad  
    JOIN dbo.PostApplication AS PA 
    ON Ad.ApplicationId = PA.Id 
    JOIN dbo.Post P 
    ON PA.JobId = P.Id
    OUTER APPLY 
    (SELECT Value FROM dbo.fnSplit(P.RequiredDocuments,',') as S 
    WHERE S.Value = Ad.DocumentTitle) X
    

    【讨论】:

    • 1 up 但我的问题没有解决。如果我需要返回 S.Value 与 ApplicationDocument 的右外连接怎么办。由于 ApplicationDocument 可能包含也可能不包含该条目
    • @EhsanSajjad 将答案更改为使用外部应用。我假设您只想要匹配的值。
    【解决方案3】:

    我在 @Humpty Dumpty@t-clausen-dk 的帮助下提出了以下查询。

    这是我需要的。此查询现在获取所有记录,我现在可以对其使用 where 子句进行过滤。

    SELECT PA.Id AS ApplicationId,
           Ad.Id AS ApplicationDocumentId,
           Ad.DocumentTitle,
           Ad.Path,
           S.value
    FROM dbo.ApplicationDocument AS Ad
    right JOIN dbo.PostApplication AS PA
    ON Ad.ApplicationId = PA.Id
    JOIN dbo.Post P
    ON PA.JobId = P.Id
    cross APPLY dbo.fnSplit(P.RequiredDocuments,',') as S
    
    where PA.Id = SomeId here
    

    【讨论】:

      【解决方案4】:

      检查括号,')'。使用不当:

       SELECT PA.Id,Ad.Id,Ad.DocumentTitle,Ad.Path 
       FROM dbo.ApplicationDocument AS Ad  
       INNER JOIN dbo.PostApplication AS PA 
        ON Ad.ApplicationId = PA.Id 
       INNER JOIN dbo.Post P 
        ON PA.JobId = P.Id
       CROSS APPlY  (select value from  dbo.fnSplit(P.RequiredDocuments,',') 
        WHERE Value =Ad.DocumentTitle))
      

      【讨论】:

      • @MadaraUchiha 它说:找不到多部分标识符“P.RequiredDocuments”
      • EhsanSajjad 然后 P.RequiredDocuments 可能不在 dbo.Post 中
      • 它在那里@MadaraUchiha
      • Ehsan sajjad 在里面使用 where 条件
      • @MadaraUchiha:这是不可能的。需要CROSS APPlY这里
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      • 2020-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-18
      • 2015-11-12
      相关资源
      最近更新 更多