-2

我有两列这样的:

ChannelURI    UserId
1020            1
1040            2
1060            3
1020            5
1090            4
1020            5

现在我想检查任何先前的行条目是否具有最后一行的最后一个值,如果是并且它具有相同的用户 ID 然后跳过,如果找到(匹配)并且具有不同的用户 ID 然后在 ChannelUri 中插入 null

在这种情况下user ID =1应该将其channeluri设置为null

知道如何实现吗?

4

3 回答 3

2

SQL 将数据视为无序集。除非您指定 ORDER BY,否则行可以按任何顺序合法地返回。

除非您还有另一个字段可以用来对数据进行排序,否则“先前的记录”实际上可能几乎是任何内容。


可以只选择所有数据并在 PHP 或 .Net 中对其进行解析,对吗? 没有。

仅仅因为数据通常以相同的顺序返回,所以永远无法保证。数据的变化、磁盘上数据的碎片化、索引、并行性等诸多因素,意味着数据随时可能以不同的顺序返回。


如果您的逻辑依赖于数据的顺序,您必须指定一个 ORDER BY 子句,因此,隐含地,数据中必须具有使您能够对其进行排序的字段。

对不起。

于 2012-05-02T21:19:57.493 回答
2

假设您有一个'Sort'用于对行进行排序的列,则以下语句可以解决问题:

UPDATE m
SET ChannelURI = NULL
FROM mytable m
JOIN mytable m2 
  ON m.ChannelURI = m2.ChannelURI
  AND m.UserId != m2.UserId
  AND m2.Sort = (SELECT MAX(sort) FROM mytable)
于 2012-05-02T21:27:34.047 回答
0

基本上,这采用与@erikxiv 的答案相同的想法,但用于SELECT TOP (1)检索最后一行,而不是过滤MAX(sort)

UPDATE m
SET ChannelURI = NULL
FROM mytable m
JOIN (
  SELECT TOP (1) ChannelURI, UserId
  FROM mytable
  ORDER BY sort DESC
) last
  ON m.ChannelURI = last.ChannelURI
  AND m.UserId   != last.UserId
于 2012-05-02T22:16:24.227 回答