如何使用Like运算符获得与Joins匹配的结果

时间:2018-03-08 11:47:02

标签: sql sql-server join

我有两个表,一个是主表&另一个是存储关键字的临时表我希望tempTable中的关键字/标签与主表中的记录匹配,并在下面显示相关结果是SQL Fiddle上的示例结构

CREATE TABLE [TestTable](
    [AutoID] [int] IDENTITY(1,1) NOT NULL,
    [Title] [nvarchar](100) NULL,
    [Category] [nvarchar](50) NULL,
    [Tags] [nvarchar](200) NULL,
    Country [nvarchar](50)
) 




INSERT INTO [TestTable] ([Title] ,[Category] ,[Tags] ,[Country]) VALUES('This is News One America','Politics','Donald Trump, Iran', 'US')
INSERT INTO [TestTable] ([Title] ,[Category] ,[Tags],[Country]) VALUES('This is News  Two Korea','Economics','North Korea, Donald Trump, Kim Jong','North Korea')
INSERT INTO [TestTable] ([Title] ,[Category] ,[Tags],[Country]) VALUES('This is News  Three  Human Rights','Human Rights','Suu Kyi, Myanmar, Rohingya','Myanmar')
INSERT INTO [TestTable] ([Title] ,[Category] ,[Tags],[Country]) VALUES('This is News  Four Syria','Conflicts','Syria, Russia, America, Turkey','Syria')
INSERT INTO [TestTable] ([Title] ,[Category] ,[Tags],[Country]) VALUES('This is News  Six  Election','Politics','US, Russia, election, Donald Trump','US')
INSERT INTO [TestTable] ([Title] ,[Category] ,[Tags],[Country]) VALUES('This is News  Seven Technology','Technology','Amazon, Alexa','US')
INSERT INTO [TestTable] ([Title] ,[Category] ,[Tags],[Country]) VALUES('This is News Eight Climate','Climate','weather, europe, climate change','UK')
INSERT INTO [TestTable] ([Title] ,[Category] ,[Tags],[Country]) VALUES('This is News five America -iran','Politics','Donald Trump, Iran','Iran')

CREATE TABLE [Tags](
    [Tags] [nvarchar](200) NULL,
)
INSERT INTO [Tags] VALUES('Donald Trump')
INSERT INTO [Tags] VALUES('iran')

我希望TAGS表中的标签与TestTable中的标签列相匹配,testTable标签可以在一列中的多个标签上单个,例如

  • 唐纳德特朗普,伊朗
  • 美国,俄罗斯,选举,唐纳德特朗普
  • 伊朗

2 个答案:

答案 0 :(得分:2)

以下是该问题的天真解决方案

SELECT     *
FROM       Tags t
INNER JOIN TestTable TT on tt.Tags like '%'+t.Tags+'%'

如果您的标签是单个单词并且您的测试标签是多个单词,理论上您可以使用上述方法得到一些误报。

例如,如果您的测试代码有一个名为“donald trump”的标签,并且您的代码是“donald”,则此方法会错误地匹配结果。

另一种方法是拆分字符串delimetered列TestTable.Tags,然后将结果值连接到tags表,以获得完全匹配。

SELECT      *
FROM        TestTable tt
CROSS APPlY (
  SELECT LTRIM(RTRIM(Value)) as Tag FROM  STRING_SPLIT(tt.Tags, ',') 
) SS
INNER JOIN  Tags t on t.Tags = ss.Tag

LTRIM和RTRIM从字符串的左侧和右侧删除空格。

字符串拆分的文档位于:https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql

LTRIM的Documentaion:https://docs.microsoft.com/en-us/sql/t-sql/functions/ltrim-transact-sql

答案 1 :(得分:1)

评论太长了。

修复您的数据结构!您需要一个联结表,每个“auto”一行,每个“tag”一行。

CREATE TABLE [Tags] (
    TagId INT IDENTITY(1, 1) PRIMARY KEY,
    Tags [nvarchar](200) NULL
);

CREATE TABLE AutoTags (
    AutoTagID int IDENTITY(1, 1) PRIMARY KEY,
    AutoId INT NOT NULL,
    TagId INT NOT NULL,
    CONSTRAINT fk_autotags_autoid FOREIGN KEY (AutoId) REFERENCES testtable(autoid),
    CONSTRAINT fk_autotags_tagid FOREIGN KEY (TagId) REFERENCES tags(tagid)
) ;

一旦有了这个结构,数据库就会保证标签是正确的。查找标签的大多数操作都会更简单,更有效。