我在兩個單獨的服務器上有兩個數據集。他們每人都拉一列信息。比較兩個數據集SQL SSRS 2005
我想創建一個報告,顯示只出現在其中一個數據集中的行的值。
從我讀過的東西看來,我想在SQL方面而不是報告方面做到這一點;我不知道該怎麼做。
如果有人能夠闡明如何做到這一點,我會非常感激。
我在兩個單獨的服務器上有兩個數據集。他們每人都拉一列信息。比較兩個數據集SQL SSRS 2005
我想創建一個報告,顯示只出現在其中一個數據集中的行的值。
從我讀過的東西看來,我想在SQL方面而不是報告方面做到這一點;我不知道該怎麼做。
如果有人能夠闡明如何做到這一點,我會非常感激。
您可以使用NOT EXISTS
子句獲得兩個表之間的差異。
SELECT
Column
FROM
DatabaseName.SchemaName.Table1
WHERE
NOT EXISTS
(
SELECT
Column
FROM
LinkedServerName.DatabaseName.SchemaName.Table2
WHERE
Table1.Column = Table2.Column --looks at equalities, and doesn't
--include them because of the
--NOT EXISTS clause
)
這將顯示在Table1
沒有出現在Table2
行。您可以反轉表名以查找Table2
中未出現在Table1
中的行。
編輯:進行編輯以顯示連接的服務器的情況。另外,如果您想要查看兩個表中不共享的所有行,則可以嘗試下面的方法。
SELECT
Column, 'Table1' TableName
FROM
DatabaseName.SchemaName.Table1
WHERE
NOT EXISTS
(
SELECT
Column
FROM
LinkedServerName.DatabaseName.SchemaName.Table2
WHERE
Table1.Column = Table2.Column --looks at equalities, and doesn't
--include them because of the
--NOT EXISTS clause
)
UNION
SELECT
Column, 'Table2' TableName
FROM
LinkedServerName.DatabaseName.SchemaName.Table2
WHERE
NOT EXISTS
(
SELECT
Column
FROM
DatabaseName.SchemaName.Table1
WHERE
Table1.Column = Table2.Column
)
您還可以使用左連接:
select a.* from tableA a
left join tableB b
on a.PrimaryKey = b.ForeignKey
where b.ForeignKey is null
這個查詢從沒有TableB中相應的記錄表A返回的所有記錄。
如果您想要出現在只有一個數據集的行,你必須對每個表的匹配關鍵字,那麼你可以使用一個完全外部聯接:
select *
from table1 t1 full outer join
table2 t2
on t1.key = t2.key
where t1.key is null and t2.key is not null or
t1.key is not null and t2.key is null
WHERE條件選擇的行,其中只有一個比賽。
雖然這個查詢的問題是,你會得到大量帶有空值的列。一種解決這個問題的方法是在SELECT子句中逐一查看列。
select coalesce(t1.key, t2.key) as key, . . .
解決此問題的另一種方法是使用帶有窗口函數的聯合。該版本彙集了所有的行和統計看來,關鍵的次數:
select t.*
from (select t.*, count(*) over (partition by key) as keycnt
from ((select 'Table1' as which, t.*
from table1 t
) union all
(select 'Table2' as which, t.*
from table2 t
)
) t
) t
where keycnt = 1
這樣做的價值來源於其表的附加列指定。它還有一個額外的列keycnt,其值爲1.如果您有組合鍵,則只需使用指定兩個表之間匹配的列列表進行替換即可。
問題是他們不只是不同的表。它們完全是不同的數據庫和服務器。我不知道如何在一次SQL調用中連接到多個服務器。 – 2012-07-13 15:24:53
如果它們都是SQL Server實例,則可以創建一個[Linked Server](http://msdn.microsoft.com/zh-cn/library/ms188279.aspx),這將允許您跨查詢/比較兩個表服務器。 – 2012-07-13 15:26:24
這就是我一直在尋找的。謝謝。我只是做了鏈接服務器,當它詢問鏈接的服務器名稱時,它使用IP(它詢問我在網絡上引用它的名稱)是否會攪亂我的SQL調用?我可以像這樣使用它:[xxx.xxx.x.xxx] .db.schema。表? – 2012-07-13 15:46:11