2012-04-19 13 views
2

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 

Iは、2つのテーブル上で与えられた、セキュリティIDの表Aに含まれる各表Bから欠落していることは、例えば

アカウント見つけるためにいくつかのSQLを必要とする、私はその下の出力が、私に紛失しているセキュリティと何がそれが欠けていない限り。

うまくいけば、それは理にかなっています。

私は必要なデータを生成するためにカーソルクエリを使用しましたが、私は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

これはエラーではありません。私はあなたがモデルアカウントのようなものだと言えると思います。アカウント1のポジションと表Bの3つのアカウントのポジションを比較します。 –

+0

私はそれを今すぐ取得します。私は悪い仮定をしたので、私は答えを削除した。 – daniloquio

答えて

0

私の知る限り、これは参加比較的単純外でなければなりません。これは、外部結合と呼ばれます。なぜなら、2つ目のテーブルに一致するものと一致しないものを含むテーブルの行を含めたいからです。 LEFT JOINというキーワードを使用するのは、テーブルAを結合節の左側に置くためです。これは、外部結合を行っていることを示しています。 where句は、それらの行だけを選択します。このセキュリティIDのテーブル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の "group"アカウントの1つに保持されていて、3つすべてではない場合、それがdiffernceとして出力に表示されないことです。上記の例では、セキュリティID「Sec2」はアカウント400にありますが、アカウント200または300にはありません。アカウント400に一致していますが、私はまだ他の2つのアカウントの違いをmy元の質問。ありがとう –

+1

私は関係を誤解したと思います。表Bの同じ列のペアが一致しない場合は、アカウントとセキュリティIDのすべてのペアを選択する場合は、次のように結合節に制約を追加することができます:A LEFT JOIN B ON A. [セキュリティID] = B. [セキュリティID] AND A.Account = 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 

ロジックは次のとおりです。

  • スタートTableAの
  • とテーブルで見つかったすべての可能なアカウントで、各行に参加B
  • 今Bのアカウントを使用して、表Bでそれを左外部結合とAさんSecurityId
  • 見つからない場合は、B.SecurityIdがnullであり、我々は、サブクエリ
  • 経由して、問題のアカウントを持っています
+0

ここでは、私があなたが提供したものと同様に働いています。それは私が近づくが、私がしようとすると、外側左最後の2行に参加する場合、私はエラーを取得する: –

+0

サーバー:メッセージ1016、レベル15、状態3、ライン23 外はオペレーターに参加が参加含むクエリで指定することはできませんテーブル。ここにはSQL: –

+0

があります。私はそれを上記の元の情報に追加しました。 –

関連する問題