我正在我的网络应用程序中添加“标记”功能。我的应用程序表结构如下;
标签:
(TagId INT IDENTITY, TagName VARCHAR(60))
标记记录:
(TaggedId INT IDENTITY, TagId, TaggedRecordId)
现在,我希望当有人向任何记录添加标签时,应该使用单个 sql 查询或使用存储过程执行以下操作;
- 标签是否已经存在于“标签”表中?
- 如果标签存在,则在“TaggedRecords”表中插入一行
- 否则,如果标签不存在,则首先将标签插入“Tag”表,然后获取新添加标签的 Id 并在“TaggedRecord”表中插入一条记录
基本上,我更感兴趣的是使用单个查询或最多两个 sql 查询来执行这些操作。我不想在 sql 存储过程中创建多个 If-Else 条件。
谢谢,
最佳答案
这个怎么样...
CREATE PROC TagMe(@TagName VARCHAR(100),@TaggedRecordId INT)
AS
DECLARE @TagId INT
SET @TagId = SELECT TagId FROM Tag WHERE TagName = @TagName
IF @TagId IS NOT NULL
BEGIN
--Tag exists
INSERT INTO TaggedRecords (TagId, TaggedRecordId) VALUES(@TagId,@TaggedRecordId)
RETURN
END
ELSE
-- New tag
BEGIN
INSERT INTO Tag (TagName) OUTPUT inserted.id INTO @TagId VALUES(@TagName)
INSERT INTO TaggedRecords (TagId, TaggedRecordId) VALUES(@TagId,@TaggedRecordId)
RETURN
END
没有对此进行测试,但理论应该是合理的:)
有关 OUTPUT 用法的另一个示例,请参阅我在 this link 上的帖子
编辑
根据下面的评论,此版本使用 EXISTS...
CREATE PROC TagMe(@TagName VARCHAR(100),@TaggedRecordId INT)
AS
DECLARE @TagId INT
IF EXISTS(SELECT TagId FROM Tag WHERE TagName = @TagName)
BEGIN
--Tag exists
SET @TagId = SELECT TagId FROM Tag WHERE TagName = @TagName
INSERT INTO TaggedRecords (TagId, TaggedRecordId) VALUES(@TagId,@TaggedRecordId)
RETURN
END
ELSE
-- New tag
BEGIN
INSERT INTO Tag (TagName) OUTPUT inserted.id INTO @TagId VALUES(@TagName)
INSERT INTO TaggedRecords (TagId, TaggedRecordId) VALUES(@TagId,@TaggedRecordId)
RETURN
END
虽然我不确定(我相信我在这里是在反对自己,但很多东西都是“视情况而定”的答案!)。这个例子实际上最适合新标签的更多使用,因为它只会执行一次 EXISTS 然后继续,而对于现有标签,它会执行 EXISTS 然后再执行 SELECT。
嗯,选择你的选择 - 或者在音量下测试这两种方法:)
关于sql - SQL中 "Tagging"查询语句怎么写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/557785/