逗号分隔列上的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所建议的,我已经规范化了我的数据,但我的第一个查询应该可以工作。