2

我正在尝试使用 SQL 服务器创建一个表,该表创建一个两者之间的差异表。我在其他帖子中没有发现的棘手部分是一个表是单个“帐户”数据,如下所示:

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 来查找表 A 中包含的每个帐户的表 B 中缺少的安全 ID

例如,给定上面的两个表,我希望下面的输出告诉我缺少的安全性以及缺少的帐户。

希望这是有道理的。

我已经使用游标查询来生成我需要的数据,但是,我正在尝试创建可以轻松应用于 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

Tricky one! Try this (I can't test it, watch out for syntax errors):

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

The logic is:

  • Start with TableA
  • Join each row with all possible accounts found in table B
  • Now left-outer-join it with Table B, using B's Account and A's SecurityId
  • If not found, B.SecurityId is null, and we have the offending Account via the subquery
于 2012-04-19T16:09:46.427 回答
0

据我所知,这应该是一个相对直接的外连接。它被称为外连接,因为我们希望将一个表中没有匹配的行包含在第二个表中以及匹配的行中。使用关键字LEFT JOIN,因为我们将表 A 放在 join 子句的左侧,这表明我们正在执行外部连接,并且应该包含 A 中在 B 中没有匹配的行。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 回答