2012-07-06 72 views
-2

我有一个数据库表,程序即将更新。在程序运行之前我已经拍下了表格的快照,然后是快照。下面是数据的一个样本:SQL - 关联信息

更新之前:

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,用户)

+4

如果您发布你的表结构,你已经尝试什么将是有益的。 – Taryn 2012-07-06 12:45:14

回答

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 
     ) 
    ) 
+0

这假设连接引用是相同的。连接引用可能会更改。谢谢。 – w0051977 2012-07-06 13:07:02

+0

然后我不认为你的问题很清楚。你想在更新之前找到那些没有链接在一起的东西吗? – Sean 2012-07-06 13:10:29

+0

是的。那些在更新之前和之后没有链接的用户。之后,我拿了一张表(JoinedUsers)和一张副本(JoinedUsers)。 – w0051977 2012-07-06 13:11:59

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)和如果你需要它,你必须自己填写这个逻辑。

这很可能会有一个更有效的方式来做到这一点,但没有模式,只能提供一般指导。

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 
    ) ;