sql从选择查询

时间:2016-01-09 13:28:17

标签: sql

你好,我需要一些糟糕的存储过程,我想不出这样的

我有这些表

指标分析

CriteriaId
Title
.......

StepCriterias

StepID
CriteriaId
OrderNum

步骤

StepID
ProcedureID
Title
...

所以我选择具有特定名称和特定数字的步骤的所有StepCriterias

SELECT * 
FROM StepCriterias sc 
INNER JOIN Steps s ON sc.StepId = s.StepId
WHERE 
    s.Title = 'MYteststep'
    ANd s.ProcedureId = 2

假设这个查询返回五行;现在我应该UPDATE所有生成的行和OrderNum应该增加1(我应该增加每行的OrderNum)。这是我的第一个问题,我想不出一个存储过程就是那个。

4 个答案:

答案 0 :(得分:1)

可能就是这样。

UPDATE sc
SET OrderNum = OrderNum + 1 
FROM StepCriterias sc 
INNER JOIN steps s ON sc.StepId = s.StepId
WHERE s.Title = 'MYteststep'
  AND s.ProcedureId = 2

答案 1 :(得分:1)

您可以使用join语句中的exsits条件替换update逻辑:

UPDATE StepCriterias sc
SET    OrderNum = OrderNum + 1
WHERE  EXISTS (SELECT *
               FROM   steps s 
               WHERE  sc.StepId = s.StepId AND
                      s.Title = 'MYteststep' AND
                      s.ProcedureId = 2)

答案 2 :(得分:0)

您可以将UPDATE与子查询一起使用,例如:

UPDATE StepCriterias 
SET OrderNum = sc.OrderNum + 1 
WHERE StepId IN (SELECT StepId 
                 FROM StepCriterias sc 
                 INNER JOIN steps s ON sc.StepId = s.StepId
                 WHERE s.Title = 'MYteststep' AND s.ProcedureId = 2);

答案 3 :(得分:0)

如果您想要每次匹配的增量,且stepcriteria可能匹配多次,则:

UPDATE StepCriterias sc
    SET OrderNum = (OrderNum + 
                    (SELECT COUNT(*)
                     FROM steps s 
                     WHERE sc.StepId = s.StepId AND
                           s.Title = 'MYteststep' AND
                           s.ProcedureId = 2
                    )
    WHERE EXISTS (SELECT 1
                  FROM steps s 
                  WHERE sc.StepId = s.StepId AND
                        s.Title = 'MYteststep' AND
                        s.ProcedureId = 2
                 );

在大多数数据库中有更简单的方法来表达这一点,但以上是适用于任何数据库的通用语法。