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