我有两个表,一个是主表&另一个是存储关键字的临时表我希望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标签可以在一列中的多个标签上单个,例如
答案 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)
) ;
一旦有了这个结构,数据库就会保证标签是正确的。查找标签的大多数操作都会更简单,更有效。