日期:2014-05-17  浏览次数:20823 次

表的连接问题,连接条件是一个字符串分拆成的多个字符串只要其中任意一个字符串是另一个表相应字段的子串就应该匹配
如何用sql语句解决如下问题:课程表Course和科目表Subject,要将两个表连接,Subject表的 “拆分”列 可以用'、’分成多个字符串,只要其中一个是在Course 表的neme列的子串,就应该连接。比如:

Course.name Subject.拆分
管理学 管理、金融

只要“管理”或“金融”至少一个是“管理学”的子串,那么就经“管理学” 和“管理、金融”对应,实现这样的sql语句怎么写呢?

------解决方案--------------------
不知道是不是你想要的?
SQL code
select a.[科目],b.[name] from [Subject] a,[Course] b
where charindex(b.[name]+N'、',a.[拆分]+N'、')>0

------解决方案--------------------
改结构吧。明显设计不对。不应该有拆分字段。应该加个对应表。 就是写个拆分函数将就连起来了。查询速度上绝对没法跟对应表的结构比。以后优化也是问题。
------解决方案--------------------
他加+N'、' 是为了,避免 '管理学'、'管理学及xx学' 这样的字符串,没法区分。如果为了这样,那就应该
(N'、'+b.[name]+N'、',N'、'+a.[拆分]+N'、') 更严谨。因为还会有'工商管理学',前后都得顾到。
------解决方案--------------------
但说句实话,即使这样的情况在你的“管理学 管理、金融” 这种数据面前,也连不出来。因为 你这种数据,在上面的语句中查询,是 从“管理、金融” 字符串里 找 “管理学” 明显没有嘛。。。因为多了个“学”。。。 所以 你还是搜搜 “SQL Split”现成的自定义函数吧,应该有人写过,拿来用用。
------解决方案--------------------
探讨
charindex 里面那个“+N”没看懂,给解释下呗,谢谢


引用:
不知道是不是你想要的?

SQL code
select a.[科目],b.[name] from [Subject] a,[Course] b
where charindex(b.[name]+N'、',a.[拆分]+N'、')>0

------解决方案--------------------
--传递字符串 分割字符串 分别显示
ALTER function [dbo].[f_splitstr]
(
@SourceSql varchar(8000),
@strSeprate varchar(100)
)
returns @temp table (F1 varchar(100))
as
begin
declare @ch as varchar(100)
set @SourceSql=@SourceSql+@StrSeprate
while(@SourceSql<>'')
begin
set
@ch=left(@SourceSql,Charindex(',',@SourceSql,1)-1)
insert @temp values(@ch)
set @SourceSql=stuff(@SourceSql,1,charindex(',',@SourceSql,1),'')
end
return
end
给你个例子可以看看