Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server MSSQL存储过程-通过比较不同表中的值来选择列_Sql Server_Database_Stored Procedures - Fatal编程技术网

Sql server MSSQL存储过程-通过比较不同表中的值来选择列

Sql server MSSQL存储过程-通过比较不同表中的值来选择列,sql-server,database,stored-procedures,Sql Server,Database,Stored Procedures,警告:我已经知道,这真是令人费解和可怕。但是,我没有构建数据库,我只需要使用它,不能更改数据库模式 以下是我正在使用的表格: 射门 ShotID标识、FilmIDFK、ShotNumber等 标签 TagID标识、名称 TaggedShot TaggedShotID标识、ShotID FK、TagIDFK、TagComment 标记分类 TagID FK,类别FK 和我的存储过程: [dbo].[SelectAllTagNames] @filmID int,

警告:我已经知道,这真是令人费解和可怕。但是,我没有构建数据库,我只需要使用它,不能更改数据库模式

以下是我正在使用的表格:

射门

ShotID标识、FilmIDFK、ShotNumber等

标签

TagID标识、名称

TaggedShot

TaggedShotID标识、ShotID FK、TagIDFK、TagComment

标记分类

TagID FK,类别FK

和我的存储过程:

    [dbo].[SelectAllTagNames]
        @filmID int,
        @tagCategory int
    AS
        DECLARE @i int
        DECLARE @numRows int
        DECLARE @ShotID int
        DECLARE @TagID int
        DECLARE @TagName nvarchar(50)
        DECLARE @shot_table TABLE(
        idx smallint Primary Key IDENTITY(1,1),
        ShotID int )
        DECLARE @tagID_table TABLE(
        idTag smallint Primary Key IDENTITY(1,1),
        TagID int)
        DECLARE @tagname_table TABLE(
        idTagName smallint Primary Key IDENTITY(1,1),
        TagName nvarchar(50))

//get all shots in the film
        INSERT @shot_table
        SELECT Shot.ShotID
        FROM Shot
        WHERE Shot.FilmID = @filmID

    //enumerate through shot table and build a tagID table of all TagIDs associated with any shot found in the shot_table
        SET @i = 1
        SET @numRows = (SELECT COUNT(*) FROM @shot_table)
        IF @numRows > 0
        BEGIN
            WHILE (@i <= (SELECT MAX(idx) FROM @shot_table))
            BEGIN

            SET @ShotID = (SELECT ShotID FROM @shot_table WHERE idx = @i)
            SET @TagID = (SELECT TaggedShot.TagID FROM TaggedShot WHERE TaggedShot.ShotID = @ShotID)

            INSERT INTO @tagID_table(TagID)
            VALUES(@TagID)

            SET @i = @i + 1

            END
        END
    //compare each TagID found in tagID_table with the TagID in the TaggedCategory table
// insert Tag.Name into new table if the Tag.TagID matches the TagID in the tagID_table and also matches the given tagCategory
        SET @i = 1
        SET @numRows = (SELECT COUNT(*) FROM @tagID_table)
        IF @numRows > 0
            WHILE (@i <= (SELECT MAX(idTag) FROM @tagID_table))
                BEGIN
                SET @TagID = (SELECT TagID FROM @tagID_table WHERE idTag = @i)
                IF EXISTS(SELECT TaggedCategory.TagId FROM TaggedCategory WHERE TaggedCategory.CategoryID = @tagCategory)
                    BEGIN

                    SET @TagName = (SELECT Tag.Name FROM Tag WHERE Tag.TagId = @TagID)

                    INSERT INTO @tagname_table(TagName)
                    VALUES(@TagName)

                    END
                END
    //return all the found tag names
    SELECT TagName
    FROM @tagname_table
以下是我努力实现的目标:
给定FilmID和Tag Category ID,这只是一个1、2或3的整数-我在codebehind中确定了这一点,我需要找到所有Tag.名称,给出这两个标准。电影是由镜头组成的。

这没有经过测试,但您无法通过提供的表的简单连接来处理您试图实现的目标。如下所示:

 SELECT DISTINCT t.NAME
 FROM Shot s
 INNER JOIN TaggedShot ts ON s.ShotId = ts.ShotId
 INNER JOIN Tag t ON ts.TagId = t.TagId
 INNER JOIN TaggedCategory tc ON t.TagId = tc.TagId
 WHERE s.FilmId = @filmId
     AND tc.Categoryid = @tagCategory
根据以下评论更新:

 SELECT t.TagId
        ,t.Name
 FROM Tag t
 WHERE t.TagId IN (
      SELECT DISTINCT t.TagId
      FROM Shot s
      INNER JOIN TaggedShot ts ON s.ShotId = ts.ShotId
      INNER JOIN Tag t ON ts.TagId = t.TagId
      INNER JOIN TaggedCategory tc ON t.TagId = tc.TagId
      WHERE s.FilmId = @filmId
          AND tc.Categoryid = @tagCategory)

请编辑问题标题,使其包含有关问题本身的信息。对于正在寻找解决方案的未来读者来说,我无法理解的复杂程序将毫无意义。我们知道它是针对MSSQL存储过程的;在标签中有这些信息。你的标题应该解释你试图解决的问题或你提出的问题。谢谢。好的,对不起,更新了标题。这很有效。我是数据库新手,从未使用过联接。非常感谢。@myeyeros我还有一个问题,如果我还想返回t.TagId和t.NAME呢?但是,我不能说选择不同的t.NAME,t.TagId,因为所有的TagId都是唯一的,这将返回所有行,然后返回重复的t.NAME。我正在查看GROUP BY函数,但它返回了一个错误。基本上,我还希望检索属于不同t.NAME的TagID。您可以修改我提供的查询,并将其用作返回不同TagID值的子查询。然后简单地将其包装到另一个查询中,该查询将命中标记表并选择子查询结果中id所在的标记。请参阅更新的答案。奇怪的是,逻辑对我来说是有意义的,但它没有返回正确的数据集,它仍然返回重复的t名称。我还尝试将SELECT DISTINCT.TagId中的WHERE t.TagId更改为SELECT DISTINCT.Name中的WHERE t.Name,它返回了更多重复的t.Name。