0

Groupというテーブルとというテーブルがあるという問題に直面していますEntryGroupテーブルには主キーがありますIdEntryテーブルには主キー、テーブルの呼び出されIdたへの外部キーがあります。表にはもう 1 つの列があります。これは整数であり、一番上にゼロが表示されるソートの重みを教えてくれるだけです。GroupIdGroupIdEntryWeightWeight

基本的に何が起こったかというとWeight、データベースの設計時に誰かがこのフィールドを null 可能にしました。ここで、テーブルに追加する予定の制約Weightに合わせて調整する必要があります。これにより、基本的に同じグループにある場合に、2 つのエントリが同じ並べ替えの重みを持つことを防ぎます。UNIQUEUNQIUE(GroupId, Weight)EntryEntry

Weight既存のすべてのデータを調べて、グループごとに各エントリの列に 0 から N までの番号を付けることができるクエリはどれですか。N はEntry内のエントリの数です。Groupの に基づいて重みを設定し、特定のIdのの最小値が最小値になるEntryようにします。IdEntryGroupWeight

Groupテーブルを通過し、すべてのEntryエントリを結合してから、それらを反復処理してシーケンスを割り当てる1 つの大きな古いクエリが必要です。しかし、どこから始めればよいかわかりません。

4

1 に答える 1

1

基本的に、MS SQL Over Clauseを使用します。

1 つのクエリでそれを行う方法を示す sqlfiddle サンプルを次に示します

お役に立てれば。

CREATE TABLE Entry (Id INT PRIMARY KEY, GroupId INT, Weight INT);

CREATE TABLE [Group] (Id INT PRIMARY KEY, Label VARCHAR(10));

INSERT [Group] (Id, Label)
VALUES(1, 'test');


INSERT Entry (Id, GroupId, Weight)
VALUES(1,1, null)

INSERT Entry (Id, GroupId, Weight)
VALUES(2,1, null)

INSERT Entry (Id, GroupId, Weight)
VALUES(3,1, null)

UPDATE E
  SET E.WEIGHT = o.WEIGHTIS
--SELECT *
FROM Entry E
INNER JOIN (
    SELECT G.Id GID, E.Id EID, 
     ROW_NUMBER() OVER(PARTITION BY G.Id ORDER BY E.ID) WeightIs
    FROM [Group] G
    INNER JOIN Entry E
      ON G.Id = E.GroupId  
) o
ON o.GID = E.GroupID AND o.EID = E.Id
于 2013-07-20T04:29:05.130 に答える