2
UPDATE
    dbo.FormDetail
SET 
    FieldOrder=FieldOrder+1
WHERE
    WHERE DocCode IN (1,2,3)
    AND FieldOrder >= (SELECT FieldOrder FROM dbo.FormDetail
                       WHERE FieldData LIKE '%OldField%'
                       AND DocCode IN (1,2,3))

不知道我在这里尝试做的事情有多清楚,但我想增加表格FieldOrderFormDetail的一些文档,但只在某个字段之后(基本上,我有一个间隙来插入一个新字段)。但明显的问题是,FieldOrder我输入的Where内容并不特定于该声明当前可能正在更新的文档。我在想使用分区可能是可能的,但我只partitionsFrom部分中使用过。任何帮助将非常感激。

更新

dbo.FormDetail 示例数据

DocCode FieldOrder FieldData

1 1 '标题'

1 2 '老场'

1 3 '签名'

2 1 '段落'

2 2 '老场'

3 1 '老场'

4

2 回答 2

2

在您现有的代码中,您的子查询执行一次,并一次性返回所有结果到您的外部查询。

您实际上想要的是为外部查询处理的每一行执行一次子查询。这称为相关子查询。

为了让它像这样工作,我做了两个改变;
1. 我在子查询中给了表一个别名
2. 我改变了子查询 WHERE 子句来引用外部查询中的表

UPDATE
  dbo.FormDetail
SET
  FieldOrder=FieldOrder+1
WHERE
  DocCode IN (1,2,3)
  AND FieldOrder >= (SELECT lookup.FieldOrder
                       FROM dbo.FormDetail AS lookup
                      WHERE lookup.FieldData LIKE '%OldField%'
                        AND lookup.DocCode = FormDetail.DocCode
                    )

另一种选择可能是加入子查询......

UPDATE
  FormDetail
SET
  FieldOrder=FieldOrder+1
FROM
  dbo.FormDetail
INNER JOIN
(
  SELECT
    DocCode,
    FieldOrder
  FROM
    dbo.FormDetail
  WHERE
    DocCode IN (1,2,3)
    AND FieldData LIKE '%OldField%'
)
  AS lookup
    ON  lookup.DocCode     = FormDetail.DocCode
    AND lookup.FieldOrder >= FormDetail.FieldOrder
于 2012-05-29T08:37:04.207 回答
0

你遇到了什么错误?我唯一能看到的错误是你没有限制你的子查询。在大型数据集上,它可能有点低效,但目前你只需要一个 MIN();

DECLARE @FormDetail TABLE(
    DocCode         INT
,   Fieldorder      INT
,   FieldData       NVARCHAR(MAX)
)

INSERT INTO @FormDetail (DocCode, FieldOrder, FieldData) VALUES (1,1, 'Title')
INSERT INTO @FormDetail (DocCode, FieldOrder, FieldData) VALUES (1,2, 'OldField')
INSERT INTO @FormDetail (DocCode, FieldOrder, FieldData) VALUES (1,3, 'Signature')
INSERT INTO @FormDetail (DocCode, FieldOrder, FieldData) VALUES (2,1, 'Paragraph')
INSERT INTO @FormDetail (DocCode, FieldOrder, FieldData) VALUES (2,2, 'OldField')
INSERT INTO @FormDetail (DocCode, FieldOrder, FieldData) VALUES (3,1, 'OldField')


UPDATE @FormDetail SET      
    FieldOrder = FieldOrder + 1 
WHERE 
    DocCode IN (1,2,3)     
AND FieldOrder >= (
    SELECT MIN(FieldOrder) FROM @FormDetail                        
    WHERE FieldData LIKE '%OldField%'                        
    AND DocCode IN (1,2,3)
) 

SELECT * FROM @FormDetail

给出以下内容:

1 2 标题

1 3 旧场

1 4 签名

2 2 段

2 3 旧场

3 2 旧场

您想要的只是在某个点之后增加您的字段顺序,对吗?

于 2012-05-29T08:43:42.307 回答