-2

私はこのような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 の 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
于 2012-05-02T22:16:24.227 に答える