如果满足条件,更新SQL Server表中的第一行

3
我有一个表格,其中包含以下行。
tblPictures
- picID - picName - galleryID - isActive 我想运行一个查询,例如选择所有galleryID=3isActive=1的图片。
如果在此选择中没有具有活动行为(即查询没有返回结果)的图片,则希望将第一张图片的isActive=1更改为galleryID=3
有人可以指导我吗?

2
你需要告诉我们如何定义“第一”。SQL Server将表视为无序行集;你需要给出标准(例如,在给定日期时间列中最早的值),以便它可以可靠地和重复地使用相同的方法来更新你所称之为“第一”的行。 - Aaron Bertrand
1
你的编辑仍然没有给出你认为的“第一行”的指示。正如 @AaronBertrand 所解释的那样,除非你有一个标准可以证明它是这样的(比如日期或时间戳,或者每行都会更改的id等),否则就没有“第一行”。也就是说,如果你有五张图片,其中galleryID = 3,那么这五行中哪一行是“第一行”? - Ken White
好的,如果没有isActive=1的记录,那么我想从tblPhotos表中选择所有galleryID=3的记录。例如,如果这个查询返回了5个结果,我想获取第一个结果并将其isActive设置为1。 - Subliminal Hash
1
如果有isActive = 1的行,你想要什么呢?请不要提出文字问题,请在每种情况下发布示例数据和所需结果。 - Aaron Bertrand
如果有isActive=1的行,则不执行任何操作。我无法发布示例代码,因为我无法弄清楚如何执行此操作 - 因此没有代码..这就是我需要您的帮助的原因.. - Subliminal Hash
显示剩余4条评论
2个回答

5

就是这样。基本上,它检查该集合中是否有任何Active记录,如果没有,则更新第一个(由picID确定)。如果您喜欢,可以将其放入存储过程或函数中,或者只需运行脚本并手动更改图库ID。

DECLARE @Count INT,
@GalleryID INT

SET @GalleryID = 3

SELECT @Count = COUNT(*)
FROM tblPictures
WHERE galleryID=@GalleryID and isActive=1

IF @Count = 0
BEGIN

UPDATE tblPictures
SET isActive = 1
WHERE picID = (
    SELECT TOP 1 picID 
    FROM tblPictures 
    WHERE galleryID = @GalleryID 
    ORDER BY picID
    )

END

更多代码

这段代码可以更新任何没有激活图片的画廊中,通过picID匹配到的第一张图片:

UPDATE tblPictures
SET isActive = 1
WHERE picID IN (
    SELECT picID 
    FROM (
        SELECT galleryID, MIN(picID) AS 'picID'
        FROM tblPictures AS p
        JOIN (
            SELECT galleryID 
            FROM tblPictures 
            WHERE isActive = 1
            ) AS s ON p.galleryID <> s.galleryID
        GROUP BY galleryID
        )
    )

最内层的子查询查找具有活动图片的图库。接下来的步骤是查找除了具有图片的图库之外的galleryID。然后,我们找到每个galleryID的最低picID,并使用它们来更新表格。


Emin,我增加了另一个查询,如果你想看一下的话,它应该可以一次完成整个表。 - Jim
今晚你就像是在写诗一样,谢谢你! - Subliminal Hash

-1

试试这个:

declare @tav table

(

gallaryid int,

isactive int

)

insert into @tav 

select

3,0 union all

select

4,0 union all

select

5,1

select * from @tav

update @tav set isactive=1

where gallaryid=3 and isactive=(select top(1)isactive from @tav  order by isactive)

select * from @tav

where gallaryid=3 and isactive=1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接