-2

プログラムが更新しようとしているデータベーステーブルがあります。プログラムを実行する前にテーブルのスナップショットを撮り、後でスナップショットを撮りました。データのサンプルは次のとおりです。

更新前:

JoinReference   User
1               User 1
1               User 2
1               User 3
2               User 4
2               User 5
2               User 6

更新後:

JoinReference   User
3               User 1
3               User 2
3               User 3
4               User 4
4               User 5
5               User 6

更新後にリンクされていないすべてのユーザーを見つけようとしています。たとえば、ユーザー1; ユーザー2とユーザー3は、更新の前後でリンクされます(結合参照が異なっていても)。ユーザー4と5は、更新後もリンクされています。更新後、ユーザー6はリンクされません。更新後にユーザー6を返そうとしています。派生テーブルを使用してみましたが、機能しません。

これは非常に大規模なデータベース用です。私が与えた例は、問題を説明するために私が作成したフィールドを使用しています。この例のデータベース構造は次のようになります。

CREATE TABLE JoinedUsers(JoinReference int、User)

4

3 に答える 3

0

あなたはの線に沿って何かが欲しい

SELECT *
  FROM myTable
 WHERE (row_was_updated)
   AND JoinReference IN
       (SELECT JoinReference
          FROM myTable
         GROUP BY JoinReference
        HAVING COUNT(*) = 1)

必要なWHERE (row_was_updated)場合と不要な場合があり、必要に応じてそのロジックを自分で入力する必要があります。

それを行うためのより効率的な方法がある可能性がありますが、スキーマがなければ、一般的なガイダンスを提供することしかできません。

于 2012-07-06T12:48:12.437 に答える
0
SELECT b1.user AS user1
     , b2.user AS user2
FROM BeforeTable AS b1                          --- user1 and
  JOIN BeforeTable AS b2                        --- user2 were linked
    ON  b1.JoinReference = b2.JoinReference     --- before the update
WHERE b1.user < b2.user
  AND NOT EXISTS                                --- and are not linked
      ( SELECT *
        FROM AfterTable AS a1                   --- after the update
          JOIN AfterTable AS a2
            ON  a1.JoinReference = a2.JoinReference 
        WHERE a1.user = b1.user
          AND a2.user = b2.user
      ) ;
于 2012-07-06T12:55:52.537 に答える
0
select     UnpairedBefore.userid
from 
           (select    main.*
           from       tableBefore main
           left join  tableBefore ref
           on         main.joinreference = ref.joinreference
           and        main.userid <> ref.userid
           where      ref.userid null) UnpairedBefore
inner join
           (select    main.*
           from       tableAfter main
           left join  tableAfter ref
           on         main.joinreference = ref.joinreference
           and        main.userid <> ref.userid
           where      ref.userid null) UnpairedAfter
on         UnpairedBefore.userid = UnpairedAfter.userid

また

select  [user]
from    tblBefore
where   JoinReference in 
    (
    select  JoinReference
    from    tblBefore
    group by    JoinReference
    having  COUNT(*) = 1
    )
and [user] in 
    (
    select  [user]
    from    tblAfter
    where   JoinReference in 
        (
        select  JoinReference
        from    tblAfter
        group by    JoinReference
        having  COUNT(*) = 1
        )
    )
于 2012-07-06T12:49:54.127 に答える