2012-07-06 69 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 
    ) ;