逗号分隔列上的sql联接

逗号分隔列上的sql联接,sql,left-join,Sql,Left Join,这应该很容易 我的数据是 TABLE1 AccreditationStatus FacilityId FacilityName GroupAlphabet NodeName c_NodeId -------------------------------------------------------------------------------------------------------------

这应该很容易

我的数据是

TABLE1
AccreditationStatus         FacilityId      FacilityName                GroupAlphabet   NodeName    c_NodeId
        -------------------------------------------------------------------------------------------------------------
        Current                     12359116         Addiction Medicine         A               Nepean      4


TABLE2
        NodeId                      GroupNames      RegPerSup   FacCapacility
        ------------------------------------------------------------------------
        4                           A,B,X           1           2
我的问题

select *
from table1 left join
     table2 ast
     on ast.nodeid = c_NodeId and
     GroupAlphabet in (select items from SplitString(ast.GroupNames, ','))
返回第二个表中的所有空值

Current                     12359116         Addiction Medicine         A               Nepean      4     NULL    NULL    NULL NULL
如果我尝试

select *
from table1 left join
     table2 ast
     on ast.nodeid = c_NodeId and
        GroupAlphabet like '%' + ast.GroupNames + '%'
结果仅适用于完全匹配的组,而不适用于逗号分隔的组

SplitString是一个UDF,它返回一个数据类型为nvarchar GroupAlphabet的表,如果有必要,它的类型为varchar

我的SplitString函数是

ALTER FUNCTION [dbo].[SplitString](@String NVARCHAR(max), @Delimiter char(1))    
returns @temptable TABLE (items NVARCHAR(max))       
as      
begin  
      declare @idx int   
     declare @slice NVARCHAR(max)         
select @idx = 1     
       if len(@String)<1 or @String is null  return   
      while @idx!= 0       
 begin            
set @idx = charindex(@Delimiter,@String)     
       if @idx!=0             
   set @slice = left(@String,@idx - 1)     
       else             
   set @slice = @String   
          if(len(@slice)>0)           
insert into @temptable(Items) values(@slice)      
       set @String = right(@String,len(@String) - @idx)      
      if len(@String) = 0 break      
  end   
 return       
 end
使用like的正确格式为:

我不确定你的第一个问题出了什么问题。但是,您应该使用连接表,而不是将事物列表存储在分隔字符串中。SQL有一个很好的数据结构来存储列表。它被称为表,而不是字符串。

使用like的正确格式是:


我不确定你的第一个问题出了什么问题。但是,您应该使用连接表,而不是将事物列表存储在分隔字符串中。SQL有一个很好的数据结构来存储列表。它被称为表,而不是字符串。

Gordon Linoff适合于行级数据存储,而不是逗号分隔的。 若您使用了逗号分隔的数据,并且表的大小很大,那个么我还有一个解决方案可以为MS SQL Server提供良好的查询性能

将数据以逗号分隔以列出,然后对所需的表使用JOIN

 SELECT A.OtherID,  
     Split.a.value('.', 'VARCHAR(100)') AS Data  
 FROM  
 (
     SELECT OtherID,  
         CAST ('<M>' + REPLACE(Data, ',', '</M><M>') + '</M>' AS XML) AS Data  
     FROM  Table1
 ) AS A CROSS APPLY Data.nodes ('/M') AS Split(a); 

Gordon Linoff适合行级数据存储,而不是逗号分隔。 若您使用了逗号分隔的数据,并且表的大小很大,那个么我还有一个解决方案可以为MS SQL Server提供良好的查询性能

将数据以逗号分隔以列出,然后对所需的表使用JOIN

 SELECT A.OtherID,  
     Split.a.value('.', 'VARCHAR(100)') AS Data  
 FROM  
 (
     SELECT OtherID,  
         CAST ('<M>' + REPLACE(Data, ',', '</M><M>') + '</M>' AS XML) AS Data  
     FROM  Table1
 ) AS A CROSS APPLY Data.nodes ('/M') AS Split(a); 

你的问题是什么?如果是,为什么第一个查询不起作用?然后您还需要提供SplitString函数的定义。此外,您确实不应该在列中使用逗号分隔的值。这是对第一范式的违反,它造成了无穷无尽的问题。使用类似SplitString的函数的唯一有效原因是,您可以将CSV输入字符串转换为行集,以便存储在适当的关系表结构中。Hi。这是一个常见问题。请总是用谷歌搜索你的问题/问题/目标的许多清晰、简洁和具体的版本/措辞,有或没有你的特定字符串/名称,并阅读许多答案。将发现的相关关键字添加到搜索中。如果你找不到答案,就发布,使用一种变体搜索你的标题和标签的关键词。请参见文本上方的向下投票箭头鼠标。请阅读并采取行动-包括明确的规格和期望的输出。可能重复@RBarryYoung是的,我的问题是为什么它不工作,我已经添加了自定义项。根据JERRY和Gordon的建议,我已经规范化了我的数据,但我的第一个查询应该是有效的。你的问题是什么?如果是,为什么第一个查询不起作用?然后您还需要提供SplitString函数的定义。此外,您确实不应该在列中使用逗号分隔的值。这是对第一范式的违反,它造成了无穷无尽的问题。使用类似SplitString的函数的唯一有效原因是,您可以将CSV输入字符串转换为行集,以便存储在适当的关系表结构中。Hi。这是一个常见问题。请总是用谷歌搜索你的问题/问题/目标的许多清晰、简洁和具体的版本/措辞,有或没有你的特定字符串/名称,并阅读许多答案。将发现的相关关键字添加到搜索中。如果你找不到答案,就发布,使用一种变体搜索你的标题和标签的关键词。请参见文本上方的向下投票箭头鼠标。请阅读并采取行动-包括明确的规格和期望的输出。可能重复@RBarryYoung是的,我的问题是为什么它不工作,我已经添加了自定义项。正如JERRY和Gordon所建议的,我已经规范化了我的数据,但我的第一个查询应该可以工作。