2016-09-12 88 views
-4

我在SQL Server中有兩個學生表,我的原始運行中有一個基表以及下一天運行的新表。每個表都有般的建築,用戶名姓氏名字信息:如何從SQL Server中的兩個表中返回唯一行

基地表:

3 2509381 Brooks Corey 
3 2527352 Doss Dawone 
14 170163 Belin Teaira 
14 2465666 Arlington Xavier 
14 2465941 Smith Jerald 
14 2466022 Junious Dontrell  
14 2466898 Shelton Rayonna 
14 2468144 Sullivan James 
14 2468612 Brown Jerron 
14 2469949 Quinn Jordan 

新表:

3 2527352 Doss Dawone 
14 170163 Belin Teaira 
14 2465666 Arlington Xavier 
14 2465941 Smith Jerald 
14 2466022 Junious Dontrell  
14 2466898 Shelton Rayonna 
14 2468144 Sullivan James 
14 2468612 Brown Jerron 
3 2469949 Quinn Jordan 
14 1234512 Davis John 

在這裏我的例子中,布魯克斯被刪除,奎因已經建設數改變了,戴維斯被添加了我希望我的結果表看起來像這樣。

審計表:

3 2509381 Brooks Corey 
14 2469949 Quinn Jordan 
14 1234512 Davis John  

我用兩個不同的查詢,以獲得這些結果

SELECT * 從test1的 除了 SELECT * 從TEST2

3 2509381 Brooks Corey 
14 2469949 Quinn Jordan 

選擇* 從TEST2 除了 SELECT * 從test1的

3 2469949 Quinn Jordan 
14 1234512 Davis John  

如何讓他們產量在審計表中的所有增量。我試圖聯合我的兩個選擇陳述,但沒有工作...

+4

爲什麼您的結果集忽略從第一個表中的'樓= 3'行? – Lamak

+1

我相信你可能不得不在谷歌JOINs在SQL中,並嘗試第一次。你的問題顯示你沒有努力做出查詢。 – techspider

+1

審計表錯過了一些信息(比如'insert','update','delete') –

回答

0

我假設學生號碼是獨一無二的?或者,如果您沒有提供所有列,有一些方法可以確定什麼是唯一行。你需要這個,否則你不能檢測到什麼是新的,什麼是變化的。或者是什麼被刪除和添加。

通常,我們將使用將項目連接在一個唯一字段上的查詢,在此情況下可以是UserID。然後,您的加入需要比較各個其他字段。

外連接會告訴你是否有關於插入和刪除的內容。例如,我可以這樣做:

select * 
from base b 
    full outer join new n 
    on b.userid = n.userid 

如果你這樣做,那麼你會看到各種各樣的東西。如果對於b.userid而不是n.userid存在NULL,那麼在New表中不存在新表中的新行。如果你有相反的地方,那麼你有刪除。對於更改,您可以比較每列的值,然後確定不同之處。您可以選擇在幾個查詢中處理這個問題,每個查詢都會查找單獨的內容,如插入查詢,刪除查詢和更改查詢。您可以將這些聯合起來,作爲您可以插入審計表的結果帽。

注意:在許多系統中,我們將使用觸發器實時捕獲這些更改以進行審計(或SQL Server中的其他審計機制)。

0

一種方式是建立一個例外查詢,使用插入到一個新表捕獲數據:

創建表mytable_audit (大廈,用戶名,姓氏,名字,Audit_Date)

Insert into mytable_audit 
Select Building, UserID, Lastname, Firstname, getdate() from mytable2 
EXCEPT 
Select Building, UserID, Lastname, Firstname, getdate() from mytable 

這種方法唯一的問題是它不會告訴你爲什麼數據在表中。您可以通過將其作爲子查詢來解決此問題(按照wayOutwest的說法提供,您擁有一個唯一鍵),然後重新連接到源表。這樣你可以添加一個case語句來提供一個指標。 最後一個聯盟第二查詢檢查刪除學生:

Create table mytable_audit 
    (Building int, Username int, Lastname varchar(100), Firstname varchar(100), Audit_Date datetime, ChangeType varchar(100)) 

    Insert into mytable_audit 

    Select aa.*, getdate(), 
    case when aa.building<>mt.building then 'Building Changed' 
     when mt.userid is null then 'Student Added' 
     when aa.lastname<>mt.lastname or aa.firstname<>mt.firstname then 'Student Name Changed' 
    end as changetype 
    from 
    (Select Building, UserID, Lastname, Firstname from mytable2 
    EXCEPT 
    Select Building, UserID, Lastname, Firstname from mytable) aa 

    left join mytable mt on aa.userID=mt.userID 

    UNION 

    Select Building, UserID, Lastname, Firstname, getdate(), 'Student Removed' from mytable mt 
    left join mytable2 mt2 on mt.userid=mt2.userid 
    where mt2.userid is null 
相關問題