我有两个这样的列:
ChannelURI UserId
1020 1
1040 2
1060 3
1020 5
1090 4
1020 5
现在我想检查前一行中的任何条目是否具有最后一行的最后一个值,如果是,并且它具有相同的userID,然后跳过,如果找到(匹配)并且使用不同的userId,则在ChannelUri中插入null < / p>
在这种情况下,user ID =1
应将channeluri
设置为null
任何想法如何实现?
答案 0 :(得分:2)
SQL认为数据是无序集。除非您指定ORDER BY,否则行可以合法地以任何顺序返回。
除非您还有其他字段可以订购数据,否则“之前的记录”实际上几乎可以是任何字段。
你可以只选择所有数据并用PHP或.Net解析它,对吗?的 不。 强>
因为数据通常以相同的顺序返回,所以永远不会保证。对数据的更改,磁盘上数据的碎片,索引,并行性和许多其他因素意味着数据可以随时以不同的顺序返回。
如果您的逻辑依赖于数据的顺序,则必须指定ORDER BY子句,因此,暗示必须在数据中包含允许您对其进行排序的字段。
对不起。
答案 1 :(得分: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)
答案 2 :(得分:0)
基本上,这与@erikxiv's answer使用相同的想法,但使用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