2017-05-31 60 views
-1

SQL server:删除基于关键字匹配的结果全部

我有一个帐户可以有多个行的金融交易数据库。称之为TableA。

我有另一个日常代表活动的数据库,其中帐户可以有多行。这是TableB。

当TableA中的帐户在TableB中具有某种特定的交易类型而没有特定的交易类型时,它违规并需要出现在报告中。

TableB中正确的活动类型在标题字段中包含字符串“%roll%”。因此,我想要显示TableA中所有具有交易类型X的帐户,但在TableB中没有包含“%roll%”的活动标题。

我遇到的问题是当TableB中的帐户具有活动类型“%roll%”,这使得它成为一个好帐户,如果该帐户具有其他活动类型,它会显示在我的结果集中。我如何从结果中排除好账户?

这是当前查询:

SELECT distinct 
DATEDIFF(DAY,GETDATE(),a.transaction_dt) as 'Aging' 
,b.RECORD_OPENED_DT 
,a.branch_cd 
,a.account_cd 
,a.branch_cd+a.account_cd as 'FULL_ACCT' 
,b.ADT_CUSTOMER_CD as 'ACCT_TYPE' 
,c.FIRST_NM 
,c.LAST_NM 
,c.COMPANY_NM 
,a.rr_cd 
,e.RR_NM 
,f.ADDRESS_EMAIL_TXT 
,i.activityEndTime 
,i.title 
,a.batch_cd 
,a.entry_cd 
,a.processing_dt 
,a.transaction_dt 
,a.tran_total_amt 

FROM (SELECT branch_cd, account_cd, rr_cd, batch_cd, entry_cd, processing_dt, transaction_dt, tran_total_amt 
    FROM TableA 
     WHERE BRANCH_CD > '299' 
     and BRANCH_CD < '400' 
     and batch_cd = 'wt' 
     and (entry_cd like 'cd%' 
      or entry_cd like 'ca%' 
      or entry_cd like 'ce%' 
      or entry_cd like 'cb%' 
      or entry_cd like 'rft') 
     and PROCESSING_DT > '2017-04-01 00:00:00.000' 
     and TRAN_TOTAL_AMT > '0.00') a 



left join Table0 b 
    on a.BRANCH_CD = b.BRANCH_CD 
    and a.ACCOUNT_CD = b.ACCOUNT_CD 
    and b.ADT_CUSTOMER_CD in ('120','121','122','122','123','124','125','126','129','130','131','132','133','134','135','139','140','141','142','143', 
     '150','151','160','161','170','171','172','180','181','182','183','184','185','186','187','188','189') 


left join Table1 c 
    on a.BRANCH_CD = c.BRANCH_CD 
    and a.ACCOUNT_CD = c.ACCOUNT_CD 
    and AP_SEQ_NBR = '1' 

left join Table2 d 
    on a.BRANCH_CD = b.BRANCH_CD 
    and a.ACCOUNT_CD = b.ACCOUNT_CD 
    and (CASE WHEN a.BRANCH_CD < '699' THEN '000' 
       ELSE a.BRANCH_CD 
       END)+a.RR_CD = (d.BRANCH_CD+d.RR_CD) 

left join Table3 e 
    on a.BRANCH_CD = b.BRANCH_CD 
    and a.ACCOUNT_CD = b.ACCOUNT_CD 
    and d.CRD_NBR = e.CRD_NBR 

left join Table4 f 
    on a.BRANCH_CD = b.BRANCH_CD 
    and a.ACCOUNT_CD = b.ACCOUNT_CD 
    and (CASE WHEN a.BRANCH_CD < '699' THEN '000' 
       ELSE a.BRANCH_CD 
       END)+a.RR_CD = (f.BRANCH_CD+f.RR_CD) 

left join Table5 g 
    on (a.branch_cd+a.account_cd) = g.accountnumber 


left join Table6 h 
    on (a.branch_cd+a.account_cd) = g.accountnumber 
     and g.primaryownerid = h.entityId 

right join (SELECT id, classcode, statuscode, title, activityEndTime 
      FROM TableB 
     where classCode = 'doc' 
     and statusCode = 'comp' 
     and title not like '%roll%') i 
    on (a.branch_cd+a.account_cd) = g.accountnumber 
     and g.primaryownerid = h.entityId 
     and h.actId = i.id 
+1

你能告诉我们的表模式和样本数据? –

+0

更新了主帖。 –

回答

0

你的问题有点通用 - 所以我会提供一个比较通用的答案。

有一个“IN”谓词,你可以用NOT来反转。喜欢的东西:

SELECT 
    ta.* 
FROM 
    TableA AS ta 
WHERE 
    ta.accountId NOT IN (SELECT tb.accountId FROM TableB AS tb WHERE title LIKE '%roll%') 

使用NOT IN的概念,它会适合在这里查询:

left join Table6 h 
    on (a.branch_cd+a.account_cd) = g.accountnumber 
     and g.primaryownerid = h.entityId 
     AND h.actId NOT IN (SELECT id FROM TableB WHERE title LIKE '%roll%') -- This Line ensures that account IDs are only allowed from table6 if they aren't related to infractions from tableB. 

一般来说,如果你不需要从表B显示的信息,不包括它在你的FROM中,但将它用作你的WHERE或JOIN中的过滤器。引入数据增加了服务器需要完成的工作。但是,如果您的查询需要来自TableB和TableA的数据,则通过所有方式在没有IN谓词的情况下加入它们。如果您公开了一个清理过的模式或提供了一些示例查询,这将会很有帮助。

感谢您添加您的工作 - 它仍然有点欠缺,但我认为我已经足够帮助了。展望未来,当您在Stack Overflow上发布信息时,首先展示您尝试过的尝试的问题和代码示例,以便您不会被拒绝投票。 FWIW--我不会降低问题的质量,只是在他们正在拖动的时候回答。

让我知道这个方向是否帮助你。在其他线程中可以解决的性能问题,但这应该更接近于让你找到你想要的结果。

+0

添加当前查询以发布。 –

+1

正如我在@ Ben的回复中评论的那样,我使用了一个带有内部联接的子查询来创建“好”帐户列表,然后使用“NOT IN”找到不好的帐户。你帮助我走上正轨! –

0

如果你想使用一个连接:

SELECT * -- just the rows you need 
FROM TableA 
LEFT JOIN TableB on TableB.Id = TableA.Id 
WHERE TableA.TransactionType = "Something" and 
TableB.ActivityType not like '%roll%' 
+0

我将当前的代码添加到主帖子中。我基本上做了你的建议,但问题是,如果TableB除了“%roll%”之外还有ActivityType,当我想要的是根本不列出该帐户时,我会得到这些行。 –

+0

正确的连接是否需要左连接?查看Daan Timmer的答案:https:// stackoverflow。com/questions/4715677/left-join-and-right-join-in-sql-server – Ben

+0

实际上我使用了一个带有内部联接的子查询来创建“好”帐户列表,然后使用“NOT IN“找到坏的。你帮助我走上正轨! –