如何对一列子串进行两次SQL查询,以使用另一个的附加结果搜索数据库

时间:2016-03-18 13:54:40

标签: sql sql-server xml sql-server-2012

我有两个select语句,它们都包含一个从数据库表派生的子串。它们是从varchar派生的子字符串,它应该是一个XML,但是保存为varcars,因为它们可能格式不正确并且可能无效。

我正在尝试获取导致第一个查询的表,一个包含50个Varchars的列表,并使用第二个查询搜索数据库。如果我在第一个查询中使用每一行并附加一个字符串来获取节点,我可以从每个SQLmessageID获得0到n个SQLRelatesMessageID集(" z4480"这里是一个示例)。

我已经尝试了一个游标实现,但是性能让我不知所措。如果您尝试使用as别名给substring列,则Join不起作用。我应该采取哪些步骤来获取SQLRelatesMessageID的整体列表。我的目标是在给定NCPDPID的情况下获取所有MessageLogId(图中的3个)。

我正在使用SQL Server Manager 2012.

--1--Recieves a list based on a given NCPDPID node Value
select substring(m.message, charindex('<MessageID>', m.message)+11, charindex('</MessageID>', m.message)-charindex('<MessageID>', m.message)-11) as 
 SQLmessageID from messagelog m where message like '%<NCPDPID>'+'1234567'+'</NCPDPID>%' 

--2--Selects messageID from top select and searches RelatesToMessageID node

select substring(r.message, charindex('<RelatesToMessageID>', r.message)+20,   charindex('</RelatesToMessageID>', r.message)-charindex('<RelatesToMessageID>',  r.message)-20) as SQLRelatesMessageID, * from messagelog r 
where message like ('%<RelatesToMessageID>'+'z4480'+'</RelatesToMessageID>%') 

enter image description here

1 个答案:

答案 0 :(得分:0)

这适用于这个答案。

---main
SELECT * FROM 
  (
 select substring(m.message, charindex('<MessageID>', m.message)+11,  charindex('</MessageID>', m.message)-charindex('<MessageID>', m.message)-11) as  SQLmessageID from messagelog m 
where message like '%<NCPDPID>1234567</NCPDPID>%' and dateTime > '3/01/2016'
 ) a JOIN 
 (
select 
  substring(r.message, charindex('<RelatesToMessageID>', r.message)+20,  charindex('</RelatesToMessageID>', r.message)-charindex('<RelatesToMessageID>',  r.message)-20) as SQLRelatesMessageID, 
  message, 
  messagelogid from messagelog r
 where 
  dateTime > '3/01/2016' AND 
  message LIKE ('%<RelatesToMessageID>%</RelatesToMessageID>%') 
  ) b ON b.SQLRelatesMessageID = a.SQLmessageID