JOIN ON LIKE问题SQL服务器中的EXERE EXISTS

前端之家收集整理的这篇文章主要介绍了JOIN ON LIKE问题SQL服务器中的EXERE EXISTS前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试使用Tag搜索,并且它主要使用LIKE Tag匹配的例外.

我已将示例代码添加SQLFiddle以进行播放,并在此处包含它:

表和数据

  1. CREATE TABLE Attendees
  2. (
  3. Id INT,Text VARCHAR(500)
  4. );
  5.  
  6.  
  7. CREATE TABLE Tags
  8. (
  9. Id INT,Description VARCHAR(50)
  10. );
  11.  
  12. CREATE TABLE AttendeeTags
  13. (
  14. AttendeeId INT,TagId INT,Value VARCHAR(50)
  15. );
  16.  
  17. INSERT INTO Attendees VALUES (1,'Attendee 1');
  18. INSERT INTO Attendees VALUES (2,'Attendee 2');
  19.  
  20. INSERT INTO Tags VALUES (1,'Tag Name 1');
  21. INSERT INTO Tags VALUES (2,'Tag Name 2');
  22.  
  23. INSERT INTO AttendeeTags VALUES (1,1,'Value 1');
  24. INSERT INTO AttendeeTags VALUES (1,'Value 2');
  25. INSERT INTO AttendeeTags VALUES (1,2,'Value 2');
  26. INSERT INTO AttendeeTags VALUES (2,'Value 1');

询问

  1. DECLARE @MandatoryTagXml XML
  2.  
  3. SET @MandatoryTagXml = '<tags><tag><description>Tag Name 1</description><value>Value 2</value></tag></tags>'
  4.  
  5. ;WITH MandatoryTags AS
  6. (
  7. SELECT TagValue.value('(./value)[1]','nvarchar(100)') AS value,TagValue.value('(./description)[1]','nvarchar(100)') AS [description]
  8. FROM @MandatoryTagXml.nodes('/tags/tag') AS T(TagValue)
  9. )
  10.  
  11. SELECT DISTINCT A.Id [AttendeeId]
  12. FROM [dbo].[Attendees] A
  13. INNER JOIN [dbo].[AttendeeTags] AT ON AT.AttendeeId = AttendeeId
  14. INNER JOIN [dbo].[Tags] T ON T.Id = AT.TagId AND T.[Description] IN (SELECT [description] FROM MandatoryTags)
  15. WHERE NOT EXISTS (
  16. SELECT T.Id,c.value
  17. FROM MandatoryTags c
  18. JOIN Tags T
  19. ON c.[description] = T.[Description]
  20. -- Add LIKE match to value - This is the problem line
  21. JOIN AttendeeTags AT
  22. ON AT.Value LIKE '%' + C.[Value] + '%'
  23. EXCEPT
  24. SELECT ATT.TagId,ATT.Value
  25. FROM [AttendeeTags] ATT
  26. WHERE ATT.AttendeeId = A.Id
  27. )

我想要的是在Tags.Description与@MandatoryTagXml中的描述完全匹配时获得结果,并且AttendeeTags.Value与@MandatoryTagXml中提供的值相似

没有以下行就能按预期工作(即,当XML完全匹配时)

  1. JOIN AttendeeTags AT ON AT.Value LIKE '%' + C.[Value] + '%'

但是当我加入它时,我开始得到不正确的结果.例如,设置Value应返回Attendee.Id,但它不会返回任何结果.

我尝试过各种EXISTS和NOT EXISTS,EXCEPT和INTERSECT等组合,但无法在所有情况下都能使用它.

谁能提供任何关于如何使其工作的建议?

解决方法

我认为你的联系比需要的更复杂……
  1. DECLARE @MandatoryTagXml XML
  2.  
  3. SET @MandatoryTagXml = '
  4. <tags>
  5. <tag><description>Tag Name 1</description><value>Value 1</value></tag>
  6. <tag><description>Tag Name 2</description><value>Value 2</value></tag>
  7. </tags>'
  8.  
  9. ;WITH MandatoryTags AS
  10. (
  11. SELECT TagValue.value('(./value)[1]','nvarchar(100)') AS [description]
  12. FROM @MandatoryTagXml.nodes('/tags/tag') AS T(TagValue)
  13. )
  14.  
  15. SELECT A.Id [AttendeeId]
  16. FROM [dbo].[Attendees] A
  17. INNER JOIN [dbo].[AttendeeTags] AT
  18. INNER JOIN [dbo].[Tags] T
  19. ON T.Id = AT.TagId
  20. ON AT.AttendeeId = A.Id
  21.  
  22. INNER JOIN MandatoryTags m
  23. ON T.Description = m.Description
  24. AND AT.Value LIKE ('%' + m.Value + '%')
  25. GROUP BY A.Id
  26. -- Make sure that all of the tags are matched
  27. HAVING COUNT(*) = (SELECT COUNT(*) FROM MandatoryTags)

更新:我已经更改了sql以强制匹配xml中的所有标记.

猜你在找的MsSQL相关文章