2009-02-18 47 views
0

我有一個SQL病態問題,所以我通常通過構建快速軟件應用程序來處理我的SQL問題來排序所有數據庫問題。如何處理SQL中的長比較

(因爲我也是做在這種情況下)

感謝StackOverflow的,我想我可以羞愧到正確性,所以我想了解如何使這種SQL故障排除的實際SQL或T-SQL本身(如果可能):

我:

數據庫DB1表A(unitNo,BuildingNo)

數據庫DB2表B(unitNo,BuildingNo)

  1. 欲拿出單元(單元數)從數據庫DB1不上表B中從數據庫DB2,反之亦然存在存在於表A 。

  2. 可以有多個單元具有相同的單元編號,這是因爲可以給不同建築物的單元賦予相同的單元編號。

  3. 我沒有對任何數據庫的寫入權限。

我希望這不是視爲「給我德codz」的帖子,我想知道的人更多的SQL流暢度比我如何排序的這種算法,職位,教程或暗示更比歡迎,沒有完整的代碼要求,但如果它有助於理智,那麼請做。

起初,我以爲我可以從一個表中獲取所有的單元號和像這樣排除他們在選擇從其他:

select concated.unit from 
(SELECT ( unitNo + ',' + CONVERT(varchar(12), BuildingNo)) as unit 
FROM A) concated 
having concated.unit not in 

(
'201,1', 
'202,1', 
'203,1', 
'204,1', 
'205,1', 
'206,1', 
[...] 

這通常會工作,但單位從任何數字一個表是巨大的,嘗試這種崩潰的SQL服務器:

「跑出來的堆棧空間」

謝謝,

Ric

回答

3

我認爲你正在尋找完整的外連接。其中給出了您在第1部分中要求的單位數。

Select 
    A.UnitNumber, B.UnitNumber 
from 
    DB1.dbo.TableA A FULL OUTER JOIN DB2.dbo.TableB B 
     on A.UnitNumber = B.UnitNumber 
     and A.BuildingNumber = B.BuildingNumber 
Where 
    A.UnitNumber is null or B.UnitNumber is null 

其他我可能感興趣的查詢如下所述。

這給你的記錄在不在B.

Select 
    A.UnitNumber 
From 
    DB1.dbo.TableA A Left Join DB2.dbo.TableB B 
     on A.UnitNumber = B.UnitNumber 
     and A.BuildingNumber = B.BuildingNumber 
Where 
    B.UnitNumber is null 

而你只是扭轉它找到B中不在A.記錄

Select 
    B.UnitNumber 
From 
    DB2.dbo.TableB B left join DB1.dbo.TableA A 
     on B.UnitNumber = A.UnitNumber 
     and B.BuildingNumber = A.BuildingNumber 
Where 
    A.UnitNumber is null 
+0

謝謝你,無知是不是幸福,因爲他們說。謝謝。 – 2009-02-18 11:16:37

+0

沒有概率的人。我現在正在用C++來檢查它。它很爛... – 2009-02-18 11:23:45

2

正如JPunyon說,但如果你想他們都在一個列表中,則是這樣的:

Select 
    [UnitNumber] = COALESCE(A.UnitNumber, B.UnitNumber), 
    [Source] = CASE WHEN A.UnitNumber IS NOT NULL THEN 'A' ELSE 'B' END 
from 
    DB1.dbo.TableA A 
    FULL OUTER JOIN DB2.dbo.TableB B 
     on A.UnitNumber = B.UnitNumber 
Where 
    A.UnitNumber is null or B.UnitNumber is null 
ORDER BY COALESCE(A.UnitNumber, B.UnitNumber)