2

2つの違いのテーブルを作成するSQLサーバーを使用してテーブルを作成しようとしています。他の投稿で見つけられなかったこれについてのトリッキーな部分は、1 つのテーブルが以下のような単一の「アカウント」データであることです。

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

テーブル A に含まれるセキュリティ ID のうち、各アカウントのテーブル B には含まれていないものを見つけるには、いくつかの SQL が必要です

たとえば、上記の 2 つの表から、不足しているセキュリティとそれが不足しているアカウントを示す以下の出力が期待できます。

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

カーソル クエリを使用して必要なデータを生成しましたが、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
4

2 に答える 2

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 と左外部結合します。
  • 見つからない場合、B.SecurityId は null であり、サブクエリを介して問題のアカウントを取得します。
于 2012-04-19T16:09:46.427 に答える
0

私が知る限り、これは比較的単純な外部結合であるはずです。外部結合と呼ばれるのは、1 つのテーブルの一致しない行を 2 番目のテーブルに含めるだけでなく、一致する行も含めたいからです。join 句の左側にテーブル A を配置するため、キーワードを使用しLEFT JOINます。これは、外部結合を行っていることを示しており、B に一致しない A の行を含める必要があります。where 句は、それらの行のみを選択します。もちろん、これを使用して B からアカウント番号を取得することはできません。これは、テーブル B にこのセキュリティ ID の行がないためです。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
于 2012-04-19T15:57:05.420 に答える