2012-04-19 69 views
2

我想創建一個使用SQL服務器創建兩個表之間的表的表。關於這個棘手的部分,我沒有在其他職位發現的是一個表是單一的「賬戶」數據象下面這樣:關鍵字段的1到3關係的表之間的區別

TABLE A  
Account Security ID Sec Name Shares 
------- ----------- --------- ------ 
1  Sec1   Security1 20000 
1  Sec2   Security2 50000 
1  Sec3   Security3 10000 
1  Sec4   Security4 35000 

而且,我想比較這對數據是一組「賬戶(在3本實施例中)「:

TABLE B   
Parent_acct Account Security ID Sec Name Shares 
----------- ------- ----------- --------- ------ 
Clone  200  Sec1   Security1 15000 
Clone  200  Sec3   Security3 22000 
Clone  200  Sec4   Security4 8000 
Clone  300  Sec1   Security1 11000 
Clone  300  Sec3   Security3 8500 
Clone  300  Sec4   Security4 11200 
Clone  400  Sec1   Security1 16000 
Clone  400  Sec2   Security2 7800 
Clone  400  Sec3   Security3 3500 

我需要一些SQL來定位安全ID的包括在從表B缺失的每個帳戶

例如表A,鑑於上面的兩個表,我會期望下面的輸出告訴我缺少的安全性和acco不要從它丟失。

希望這是有道理的。

我已經使用遊標查詢來生成我需要的數據,但是,我試圖創建一些可以輕鬆應用到Crystal Reports的東西,並且遊標查詢對此沒有用處。

在此先感謝您看看這個。

Output  
Account Security ID Sec Name 
(From B) (From A)  (From A) 
------- ----------- --------- 
200  Sec2   Security2 
300  Sec2   Security2 
400  Sec4   Security4 

我到目前爲止查詢:

select * FROM 
(SELECT * from 
(select p.acct_cd, s.ext_sec_id, s.sec_name, p.qty_sod 
from csm_Security s, cs_position p 
where s.sec_id = p.sec_id 
and p.acct_cd = '329' 
and s.sec_typ_cd in ('COM','FSTK','ADR')) A 
cross join 
(select distinct child_acct_cd 
cs_fund_config fc 
where fc.parent_acct_cd IN ('clone_as')) B) AAccounts, 
(select fc.child_acct_cd, s.ext_sec_id, s.sec_name, p.qty_sod 
from csm_Security s, cs_position p, cs_fund_config fc 
where s.sec_id = p.sec_id 
and fc.child_acct_cd = p.acct_cd 
and fc.parent_acct_cd IN ('clone_as') 
and s.sec_typ_cd in ('COM','FSTK','ADR')) BAccounts 
where AAccounts.ext_sec_id *= BAccounts.ext_sec_id 
and AAccounts.child_acct_cd *= BAccounts.child_acct_cd 
+0

在您的示例數據中,表A將其所有帳戶設置爲1.是否是錯誤?看起來應該是200或300或400.順便說一句,請嘗試我的答案。 – daniloquio

+0

這不是一個錯誤。我想你可以說這是一個模特賬戶。比較表B中三個賬戶中賬戶1的頭寸。 –

+0

我現在明白了;我做了一個糟糕的假設,所以我刪除了我的答案。 – daniloquio

回答

0

據我所知,這應該是一個相對簡單的外連接。它被稱爲外連接,因爲我們想要包含一個表中沒有第二個表中匹配的行以及那些行。使用關鍵字LEFT JOIN是因爲我們在連接子句的左側放置了表A,這表明我們正在執行外連接,並且應該包含A中沒有B中匹配的行。 where子句將只選擇那些行。當然,您將無法從B獲取帳號,因爲此表的B中沒有此安全標識的行。 A的賬號應該是好的,對吧?

SELECT 
    A.Account, 
    A.[Security Id] 
    A.[Sec Name] 
FROM 
    A LEFT JOIN B 
    ON A.[Security Id] = B.[Security Id] 
    AND A.Account = B.Account 
WHERE 
    B.[Security Id] IS NULL 
+0

這就是我的想法。但是,直接外部連接的問題在於,如果安全ID保留在表B中的一個「組」帳戶中,但不是全部三個,則它不會顯示在輸出中作爲不同之處。從上面的示例中,安全ID'Sec2'在帳戶400中,但不在帳戶200或300中。即使它與帳戶400匹配,我仍然希望看到其他兩個帳戶的差異,如我的輸出中所述原來的問題。謝謝 –

+1

我想我誤解了這種關係。如果你想從A中選擇所有對的帳號和安全ID,那麼你可以在連接子句中添加一個額外的約束,如下所示:'A LEFT JOIN B ON A. [安全ID] = B. [安全ID] AND A.帳戶= B.Account' – Segfault

+0

它不起作用,因爲A.Account和B.Account是不同的東西。 – daniloquio

3

棘手的一個!試試這個(我無法測試它,注意語法錯誤):

SELECT BAccounts.Account, A.SecurityID, A.SecName 
from TableA A 
    cross join (select distinct Account 
       from TableB) BAccounts 
    left outer join TableB B 
    on B.Account = BAccounts.Account 
    and B.SecurityID = A.SecurityID 
where B.SecurityID is null 

的邏輯是:

  • 開始與表A
  • 加入每一行,在表中找到所有可能的帳戶乙
  • 現在左外連接與表B它,使用B的賬戶和A的SecurityId
  • 如果沒有找到,B.SecurityId是空的,我們通過子查詢
  • 有違規帳戶
+0

以下是我一直在處理的與您提供的相似的內容。它使我接近,但如果我嘗試和最後兩行外部左加入,我收到一個錯誤: –

+0

服務器:消息1016,15級,狀態3,行23 外部聯接運算符不能在包含聯接的查詢中指定表。這裏是sql: –

+0

我已經將它添加到上面的原始信息。 –