sql - SQL中 "Tagging"查询语句怎么写?

标签 sql sql-server-2005 tsql stored-procedures

我正在我的网络应用程序中添加“标记”功能。我的应用程序表结构如下;

标签:

(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/

相关文章:

c# - 使用 Entity Framework 实现 SQL "AND"搜索

php - 如何从当前位置从数据库中获取信息?

sql-server - 在业务应用程序中使用 SQL Server Analysis Services 数据的最佳方式是什么?

sql - LINKED 服务器不返回所有行

sql - SQL Server-使用其他列值作为CSV更新列

php - mysql左连接,右表计数包括零

sql-server - 使用桌面应用程序部署 SQL Server Express 数据库?

sql-server - 为什么使用 READ UNCOMMITTED 隔离级别?

sql - 统计有序数据

sql - 在 postgreSQL 中,什么字符替换了另一个字符?